#!/usr/bin/env python
# (c) Zygmunt Krynicki 2005,
# Licensed under GPL, see COPYING for the whole text

import os
import os.path
import gdbm
import subprocess

class ProgramGroup(object):
    def __init__(self, arch, repo):
        self.arch = arch
        self.repo = repo
        self.programs = dict()
    def notice_package(self, package_name, user_visible_program_names):
        for user_visible_program_name in user_visible_program_names:
            if not self.programs.has_key(user_visible_program_name):
                self.programs[user_visible_program_name] = set()
            self.programs[user_visible_program_name].add(package_name)
    def write_database(self):
        db = gdbm.open("%s-%s.db" % (self.arch, self.repo), "n")
        for program_name, packages in self.programs.items():
            db[program_name] = "|".join(packages)
        db.close()

def build_binary_databases(scan_data="scan.data",currentArchOnly=False):
    myarch = subprocess.Popen(["dpkg","--print-architecture"], stdout=subprocess.PIPE).communicate()[0].strip()
    groups = dict()
    for arch, repo, package_name, executables in (line.strip().split('|') for line in file(scan_data)):
        if (currentArchOnly and arch != "all" and arch != myarch):
            #print "skipping ",package_name
            continue
        group_name = "%s-%s" % (arch, repo)
        if not groups.has_key(group_name):
            groups[group_name] = ProgramGroup(arch, repo)
        user_visible_program_names = [os.path.basename(executable) for executable in executables.split(',')]
        groups[group_name].notice_package(package_name, user_visible_program_names) 
    for group in groups.values():
        group.write_database()

if __name__ == "__main__":
    build_binary_databases(currentArchOnly=True)
