diff --git a/archrepo.ini.example b/archrepo.ini.example index a5cfbbd..5d37b75 100644 --- a/archrepo.ini.example +++ b/archrepo.ini.example @@ -31,9 +31,12 @@ path: /home/lilydjwg/tmpfs/test # directory. Default is on. #auto-rename: on +# What archs we support? The default is i686 and x86_64. And you can add more +# like arm, armv6h, aarch64. Archs are separated by spaces. +#supported-archs: i686 x86_64 arm + # By enabling symlink-any, the server will automatically symlink the package -# files of 'any' architecture to 'arm', 'armv6h', 'armv7h', 'aarch64', -# 'i686' and 'x86_64' +# files of 'any' architecture to supported archs. # Default is on. #symlink-any: on diff --git a/archrepo2/repomon.py b/archrepo2/repomon.py index bea8494..368a8b4 100755 --- a/archrepo2/repomon.py +++ b/archrepo2/repomon.py @@ -26,12 +26,6 @@ from . import dbutil logger = logging.getLogger(__name__) -# handles only arm*, aarch64, x86_64, i686 and any arch packages -_supported_archs = ('arm', 'armv6h', 'armv7h', 'aarch64', - 'i686', 'x86_64', 'any') -# assume none of the archs has regex meta characters -_pkgfile_pat = re.compile(r'(?:^|/).+-[^-]+-[\d.]+-(?:' + '|'.join(_supported_archs) + r')\.pkg\.tar\.xz(?:\.sig)?$') - def same_existent_file(a, b): try: return os.path.samefile(a, b) @@ -40,6 +34,7 @@ def same_existent_file(a, b): class ActionInfo(archpkg.PkgNameInfo): def __new__(cls, path, action, four=None, five=None, pkgpath=None): + print(path, action, four) if four is not None: return super().__new__(cls, path, action, four, five) file = os.path.split(pkgpath or path)[1] @@ -224,10 +219,11 @@ class RepoMan: self._do_remove(toremove) class EventHandler(pyinotify.ProcessEvent): - def my_init(self, config, wm, ioloop=None): + def my_init(self, filter_pkg, supported_archs, config, wm, ioloop=None): + self.filter_pkg = filter_pkg self.moved_away = {} self.repomans = {} - # TODO: use a expiring dict + # TODO: use an expiring dict self.our_links = set() self._ioloop = ioloop or IOLoop.instance() @@ -255,7 +251,8 @@ class EventHandler(pyinotify.ProcessEvent): (filename text unique, pkgrepo text)''') - dirs = [os.path.join(base, x) for x in _supported_archs] + self._supported_archs = supported_archs + dirs = [os.path.join(base, x) for x in self._supported_archs] self.files = files = set() for d in dirs: os.makedirs(d, exist_ok=True) @@ -276,10 +273,12 @@ class EventHandler(pyinotify.ProcessEvent): oldfiles.update(f[0] for f in self._db.execute('select filename from sigfiles where pkgrepo = ?', (self.name,))) oldfiles = {os.path.join(self._db_dir, f) for f in oldfiles} - for f in sorted(filterfalse(filterPkg, files - oldfiles), key=pkgsortkey): + for f in sorted(filterfalse(self.filter_pkg, files - oldfiles), + key=pkgsortkey): self.dispatch(f, 'add') - for f in sorted(filterfalse(filterPkg, oldfiles - files), key=pkgsortkey): + for f in sorted(filterfalse(self.filter_pkg, oldfiles - files), + key=pkgsortkey): self.dispatch(f, 'remove') def process_IN_CLOSE_WRITE(self, event): @@ -352,7 +351,7 @@ class EventHandler(pyinotify.ProcessEvent): d = newd if self._symlink_any and act.arch == 'any': - for newarch in _supported_archs: + for newarch in self._supported_archs: if newarch == arch: # this file itself continue @@ -453,10 +452,10 @@ class EventHandler(pyinotify.ProcessEvent): self._db.execute('''delete from sigfiles where filename = ? and pkgrepo = ?''', (rpath, self.name)) -def filterPkg(path): +def filter_pkg(regex, path): if isinstance(path, Event): path = path.pathname - return not _pkgfile_pat.search(path) + return not regex.search(path) def pkgsortkey(path): pkg = archpkg.PkgNameInfo.parseFilename(os.path.split(path)[1]) @@ -466,11 +465,20 @@ def repomon(config): wm = pyinotify.WatchManager() ioloop = IOLoop.instance() + supported_archs = config.get('supported-archs', 'i686 x86_64').split() + if 'any' not in supported_archs: + supported_archs.append('any') + # assume none of the archs has regex meta characters + regex = re.compile(r'(?:^|/)[^.].*-[^-]+-[\d.]+-(?:' + '|'.join(supported_archs) + r')\.pkg\.tar\.xz(?:\.sig)?$') + + filter_func = partial(filter_pkg, regex) handler = EventHandler( - filterPkg, - config=config, - wm=wm, - ioloop=ioloop, + filter_func, + filter_pkg = filter_func, + supported_archs = supported_archs, + config = config, + wm = wm, + ioloop = ioloop, ) return pyinotify.TornadoAsyncNotifier( wm,