def process_file(file, suite, component, otype, mode, action, session): cnf = Config() s = get_suite(suite, session=session) if s is None: utils.fubar("Suite '%s' not recognised." % (suite)) suite_id = s.suite_id c = get_component(component, session=session) if c is None: utils.fubar("Component '%s' not recognised." % (component)) component_id = c.component_id o = get_override_type(otype) if o is None: utils.fubar("Type '%s' not recognised. (Valid types are deb, udeb and dsc.)" % (otype)) type_id = o.overridetype_id # --set is done mostly internal for performance reasons; most # invocations of --set will be updates and making people wait 2-3 # minutes while 6000 select+inserts are run needlessly isn't cool. original = {} new = {} c_skipped = 0 c_added = 0 c_updated = 0 c_removed = 0 c_error = 0 q = session.execute("""SELECT o.package, o.priority, o.section, o.maintainer, p.priority, s.section FROM override o, priority p, section s WHERE o.suite = :suiteid AND o.component = :componentid AND o.type = :typeid and o.priority = p.id and o.section = s.id""", {'suiteid': suite_id, 'componentid': component_id, 'typeid': type_id}) for i in q.fetchall(): original[i[0]] = i[1:] start_time = time.time() section_cache = get_sections(session) priority_cache = get_priorities(session) # Our session is already in a transaction for line in file.readlines(): line = re_comments.sub('', line).strip() if line == "": continue maintainer_override = None if otype == "dsc": split_line = line.split(None, 2) if len(split_line) == 2: (package, section) = split_line elif len(split_line) == 3: (package, section, maintainer_override) = split_line else: utils.warn("'%s' does not break into 'package section [maintainer-override]'." % (line)) c_error += 1 continue priority = "extra" else: # binary or udeb split_line = line.split(None, 3) if len(split_line) == 3: (package, priority, section) = split_line elif len(split_line) == 4: (package, priority, section, maintainer_override) = split_line else: utils.warn("'%s' does not break into 'package priority section [maintainer-override]'." % (line)) c_error += 1 continue if section not in section_cache: utils.warn("'%s' is not a valid section. ['%s' in suite %s, component %s]." % (section, package, suite, component)) c_error += 1 continue section_id = section_cache[section] if priority not in priority_cache: utils.warn("'%s' is not a valid priority. ['%s' in suite %s, component %s]." % (priority, package, suite, component)) c_error += 1 continue priority_id = priority_cache[priority] if package in new: utils.warn("Can't insert duplicate entry for '%s'; ignoring all but the first. [suite %s, component %s]" % (package, suite, component)) c_error += 1 continue new[package] = "" if package in original: (old_priority_id, old_section_id, old_maintainer_override, old_priority, old_section) = original[package] if mode == "add" or old_priority_id == priority_id and \ old_section_id == section_id and \ old_maintainer_override == maintainer_override: # If it's unchanged or we're in 'add only' mode, ignore it c_skipped += 1 continue else: # If it's changed, delete the old one so we can # reinsert it with the new information c_updated += 1 if action: session.execute("""DELETE FROM override WHERE suite = :suite AND component = :component AND package = :package AND type = :typeid""", {'suite': suite_id, 'component': component_id, 'package': package, 'typeid': type_id}) # Log changes if old_priority_id != priority_id: Logger.log(["changed priority", package, old_priority, priority]) if old_section_id != section_id: Logger.log(["changed section", package, old_section, section]) if old_maintainer_override != maintainer_override: Logger.log(["changed maintainer override", package, old_maintainer_override, maintainer_override]) update_p = 1 elif mode == "change": # Ignore additions in 'change only' mode c_skipped += 1 continue else: c_added += 1 update_p = 0 if action: if not maintainer_override: m_o = None else: m_o = maintainer_override session.execute("""INSERT INTO override (suite, component, type, package, priority, section, maintainer) VALUES (:suiteid, :componentid, :typeid, :package, :priorityid, :sectionid, :maintainer)""", {'suiteid': suite_id, 'componentid': component_id, 'typeid': type_id, 'package': package, 'priorityid': priority_id, 'sectionid': section_id, 'maintainer': m_o}) if not update_p: Logger.log(["new override", suite, component, otype, package, priority, section, maintainer_override]) if mode == "set": # Delete any packages which were removed for package in original.keys(): if package not in new: if action: session.execute("""DELETE FROM override WHERE suite = :suiteid AND component = :componentid AND package = :package AND type = :typeid""", {'suiteid': suite_id, 'componentid': component_id, 'package': package, 'typeid': type_id}) c_removed += 1 Logger.log(["removed override", suite, component, otype, package]) if action: session.commit() if not cnf["Control-Overrides::Options::Quiet"]: print("Done in %d seconds. [Updated = %d, Added = %d, Removed = %d, Skipped = %d, Errors = %d]" % (int(time.time() - start_time), c_updated, c_added, c_removed, c_skipped, c_error)) Logger.log(["set complete", c_updated, c_added, c_removed, c_skipped, c_error])
def main(): cnf = Config() Arguments = [('h', "help", "Make-Maintainers::Options::Help"), ('a', "archive", "Make-Maintainers::Options::Archive", 'HasArg'), ('s', "source", "Make-Maintainers::Options::Source"), ('p', "print", "Make-Maintainers::Options::Print")] for i in ["Help", "Source", "Print"]: key = "Make-Maintainers::Options::%s" % i if key not in cnf: cnf[key] = "" extra_files = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv) Options = cnf.subtree("Make-Maintainers::Options") if Options["Help"] or not Options.get('Archive'): usage() Logger = daklog.Logger('make-maintainers') session = DBConn().session() archive = session.query(Archive).filter_by( archive_name=Options['Archive']).one() # dictionary packages to maintainer names maintainers = dict() # dictionary packages to list of uploader names uploaders = dict() query = session.execute( text(''' SELECT bs.package, bs.name AS maintainer, array_agg(mu.name) OVER ( PARTITION BY bs.source, bs.id ORDER BY mu.name ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS uploaders FROM ( SELECT DISTINCT ON (package) * FROM ( SELECT s.id AS source, 0 AS id, s.source AS package, s.version, m.name FROM source AS s INNER JOIN maintainer AS m ON s.maintainer = m.id INNER JOIN src_associations AS sa ON s.id = sa.source INNER JOIN suite on sa.suite = suite.id WHERE suite.archive_id = :archive_id UNION SELECT b.source, b.id, b.package, b.version, m.name FROM binaries AS b INNER JOIN maintainer AS m ON b.maintainer = m.id INNER JOIN bin_associations AS ba ON b.id = ba.bin INNER JOIN suite on ba.suite = suite.id WHERE NOT :source_only AND suite.archive_id = :archive_id ) AS bs ORDER BY package, version desc ) AS bs LEFT OUTER JOIN -- find all uploaders for a given source src_uploaders AS su ON bs.source = su.source LEFT OUTER JOIN maintainer AS mu ON su.maintainer = mu.id ''').params(archive_id=archive.archive_id, source_only="True" if Options["Source"] else "False")) Logger.log(['database']) for entry in query: maintainers[entry['package']] = entry['maintainer'] if all(x is None for x in entry['uploaders']): uploaders[entry['package']] = [''] else: uploaders[entry['package']] = entry['uploaders'] Logger.log(['files']) # Process any additional Maintainer files (e.g. from pseudo # packages) for filename in extra_files: extrafile = utils.open_file(filename) for line in extrafile.readlines(): line = re_comments.sub('', line).strip() if line == "": continue (package, maintainer) = line.split(None, 1) maintainers[package] = maintainer uploaders[package] = [maintainer] if Options["Print"]: for package in sorted(maintainers): sys.stdout.write(format(package, maintainers[package])) else: maintainer_file = open('Maintainers', 'w') uploader_file = open('Uploaders', 'w') for package in sorted(uploaders): maintainer_file.write(format(package, maintainers[package])) for uploader in uploaders[package]: uploader_file.write(format(package, uploader)) uploader_file.close() maintainer_file.close() Logger.close()
def main(): cnf = Config() Arguments = [('h',"help","Make-Maintainers::Options::Help")] if not cnf.has_key("Make-Maintainers::Options::Help"): cnf["Make-Maintainers::Options::Help"] = "" extra_files = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv) Options = cnf.subtree("Make-Maintainers::Options") if Options["Help"]: usage() Logger = daklog.Logger('make-maintainers') session = DBConn().session() # dictionary packages to maintainer names maintainers = dict() # dictionary packages to list of uploader names uploaders = dict() source_query = session.query(DBSource).from_statement(''' select distinct on (source) * from source order by source, version desc''') binary_query = session.query(DBBinary).from_statement(''' select distinct on (package) * from binaries order by package, version desc''') Logger.log(['sources']) for source in source_query: maintainers[source.source] = source.maintainer.name uploaders[source.source] = uploader_list(source) Logger.log(['binaries']) for binary in binary_query: if binary.package not in maintainers: maintainers[binary.package] = binary.maintainer.name uploaders[binary.package] = uploader_list(binary.source) Logger.log(['files']) # Process any additional Maintainer files (e.g. from pseudo # packages) for filename in extra_files: extrafile = utils.open_file(filename) for line in extrafile.readlines(): line = re_comments.sub('', line).strip() if line == "": continue (package, maintainer) = line.split(None, 1) maintainers[package] = maintainer uploaders[package] = [maintainer] maintainer_file = open('Maintainers', 'w') uploader_file = open('Uploaders', 'w') for package in sorted(uploaders): maintainer_file.write(format(package, maintainers[package])) for uploader in uploaders[package]: uploader_file.write(format(package, uploader)) uploader_file.close() maintainer_file.close() Logger.close()
def main(): cnf = Config() Arguments = [('h',"help","Make-Maintainers::Options::Help"), ('a',"archive","Make-Maintainers::Options::Archive",'HasArg'), ('s',"source","Make-Maintainers::Options::Source"), ('p',"print","Make-Maintainers::Options::Print")] for i in ["Help", "Source", "Print" ]: if not cnf.has_key("Make-Maintainers::Options::%s" % (i)): cnf["Make-Maintainers::Options::%s" % (i)] = "" extra_files = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv) Options = cnf.subtree("Make-Maintainers::Options") if Options["Help"] or not Options.get('Archive'): usage() Logger = daklog.Logger('make-maintainers') session = DBConn().session() archive = session.query(Archive).filter_by(archive_name=Options['Archive']).one() # dictionary packages to maintainer names maintainers = dict() # dictionary packages to list of uploader names uploaders = dict() source_query = session.query(DBSource).from_statement(''' select distinct on (source.source) source.* from source join src_associations sa on source.id = sa.source join suite on sa.suite = suite.id where suite.archive_id = :archive_id order by source.source, source.version desc''') \ .params(archive_id=archive.archive_id) binary_query = session.query(DBBinary).from_statement(''' select distinct on (binaries.package) binaries.* from binaries join bin_associations ba on binaries.id = ba.bin join suite on ba.suite = suite.id where suite.archive_id = :archive_id order by binaries.package, binaries.version desc''') \ .params(archive_id=archive.archive_id) Logger.log(['sources']) for source in source_query: maintainers[source.source] = source.maintainer.name uploaders[source.source] = uploader_list(source) if not Options["Source"]: Logger.log(['binaries']) for binary in binary_query: if binary.package not in maintainers: maintainers[binary.package] = binary.maintainer.name uploaders[binary.package] = uploader_list(binary.source) Logger.log(['files']) # Process any additional Maintainer files (e.g. from pseudo # packages) for filename in extra_files: extrafile = utils.open_file(filename) for line in extrafile.readlines(): line = re_comments.sub('', line).strip() if line == "": continue (package, maintainer) = line.split(None, 1) maintainers[package] = maintainer uploaders[package] = [maintainer] if Options["Print"]: for package in sorted(maintainers): sys.stdout.write(format(package, maintainers[package])) else: maintainer_file = open('Maintainers', 'w') uploader_file = open('Uploaders', 'w') for package in sorted(uploaders): maintainer_file.write(format(package, maintainers[package])) for uploader in uploaders[package]: uploader_file.write(format(package, uploader)) uploader_file.close() maintainer_file.close() Logger.close()
def main(): cnf = Config() Arguments = [('h', "help", "Make-Maintainers::Options::Help"), ('a', "archive", "Make-Maintainers::Options::Archive", 'HasArg'), ('s', "source", "Make-Maintainers::Options::Source"), ('p', "print", "Make-Maintainers::Options::Print")] for i in ["Help", "Source", "Print"]: key = "Make-Maintainers::Options::%s" % i if key not in cnf: cnf[key] = "" extra_files = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv) Options = cnf.subtree("Make-Maintainers::Options") if Options["Help"] or not Options.get('Archive'): usage() Logger = daklog.Logger('make-maintainers') session = DBConn().session() archive = session.query(Archive).filter_by(archive_name=Options['Archive']).one() # dictionary packages to maintainer names maintainers = dict() # dictionary packages to list of uploader names uploaders = dict() query = session.execute(text(''' SELECT bs.package, bs.name AS maintainer, array_agg(mu.name) OVER ( PARTITION BY bs.source, bs.id ORDER BY mu.name ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS uploaders FROM ( SELECT DISTINCT ON (package) * FROM ( SELECT s.id AS source, 0 AS id, s.source AS package, s.version, m.name FROM source AS s INNER JOIN maintainer AS m ON s.maintainer = m.id INNER JOIN src_associations AS sa ON s.id = sa.source INNER JOIN suite on sa.suite = suite.id WHERE suite.archive_id = :archive_id UNION SELECT b.source, b.id, b.package, b.version, m.name FROM binaries AS b INNER JOIN maintainer AS m ON b.maintainer = m.id INNER JOIN bin_associations AS ba ON b.id = ba.bin INNER JOIN suite on ba.suite = suite.id WHERE NOT :source_only AND suite.archive_id = :archive_id ) AS bs ORDER BY package, version desc ) AS bs LEFT OUTER JOIN -- find all uploaders for a given source src_uploaders AS su ON bs.source = su.source LEFT OUTER JOIN maintainer AS mu ON su.maintainer = mu.id ''').params( archive_id=archive.archive_id, source_only="True" if Options["Source"] else "False" )) Logger.log(['database']) for entry in query: maintainers[entry['package']] = entry['maintainer'] if all(x is None for x in entry['uploaders']): uploaders[entry['package']] = [''] else: uploaders[entry['package']] = entry['uploaders'] Logger.log(['files']) # Process any additional Maintainer files (e.g. from pseudo # packages) for filename in extra_files: extrafile = utils.open_file(filename) for line in extrafile.readlines(): line = re_comments.sub('', line).strip() if line == "": continue (package, maintainer) = line.split(None, 1) maintainers[package] = maintainer uploaders[package] = [maintainer] if Options["Print"]: for package in sorted(maintainers): print(format(package, maintainers[package]), end='') else: maintainer_file = open('Maintainers', 'w') uploader_file = open('Uploaders', 'w') for package in sorted(uploaders): maintainer_file.write(format(package, maintainers[package])) for uploader in uploaders[package]: uploader_file.write(format(package, uploader)) uploader_file.close() maintainer_file.close() Logger.close()