X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fcheck_archive.py;h=3e537d805c1073d811c9ac9a1edbc1ed6a24885b;hb=6cfc82886d71c7436a97ddfe7a5a1dde297886d2;hp=b9837d3049d529da66db95423e8ab023b0d610aa;hpb=cd64b76b3ae740ffa0f2c08302028ba24c663a3d;p=dak.git diff --git a/dak/check_archive.py b/dak/check_archive.py index b9837d30..3e537d80 100755 --- a/dak/check_archive.py +++ b/dak/check_archive.py @@ -41,6 +41,7 @@ import apt_inst from daklib.dbconn import * from daklib import utils from daklib.config import Config +from daklib.dak_exceptions import InvalidDscError, ChangesUnicodeError, CantOpenError ################################################################################ @@ -71,6 +72,7 @@ The following MODEs are available: validate-indices - ensure files mentioned in Packages & Sources exist files-not-symlinks - check files in the database aren't symlinks validate-builddeps - validate build-dependencies of .dsc files in the archive + add-missing-source-checksums - add missing checksums for source packages """ sys.exit(exit_code) @@ -95,8 +97,7 @@ def process_dir (unused, dirname, filenames): if dirname.find('proposed-updates') != -1: return for name in filenames: - filename = os.path.abspath(dirname+'/'+name) - filename = filename.replace('potato-proposed-updates', 'proposed-updates') + filename = os.path.abspath(os.path.join(dirname,name)) if os.path.isfile(filename) and not os.path.islink(filename) and not db_files.has_key(filename) and not excluded.has_key(filename): waste += os.stat(filename)[stat.ST_SIZE] print "%s" % (filename) @@ -119,7 +120,7 @@ def check_files(): db_files.clear() for f in q.all(): - filename = os.path.abspath(f.location.path, f.filename) + filename = os.path.abspath(os.path.join(f.location.path, f.filename)) db_files[filename] = "" if os.access(filename, os.R_OK) == 0: if f.last_used: @@ -137,7 +138,7 @@ def check_files(): print "Existent files not in db:" - os.path.walk(cnf["Dir::Root"] + 'pool/', process_dir, None) + os.path.walk(os.path.join(cnf["Dir::Root"], 'pool/'), process_dir, None) print print "%s wasted..." % (utils.size_type(waste)) @@ -149,26 +150,24 @@ def check_dscs(): Parse every .dsc file in the archive and check for it's validity. """ - cnf = Config() - count = 0 - suite = 'unstable' - - for component in cnf.SubTree("Component").List(): - component = component.lower() - list_filename = '%s%s_%s_source.list' % (cnf["Dir::Lists"], suite, component) - list_file = utils.open_file(list_filename) - - for line in list_file.readlines(): - f = line[:-1] - try: - utils.parse_changes(f, signing_rules=1) - except InvalidDscError, line: - utils.warn("syntax error in .dsc file '%s', line %s." % (f, line)) - count += 1 - except ChangesUnicodeError: - utils.warn("found invalid changes file, not properly utf-8 encoded") - count += 1 + + for src in DBConn().session().query(DBSource).order_by(DBSource.source, DBSource.version): + f = src.poolfile.fullpath + try: + utils.parse_changes(f, signing_rules=1, dsc_file=1) + except InvalidDscError: + utils.warn("syntax error in .dsc file %s" % f) + count += 1 + except ChangesUnicodeError: + utils.warn("found invalid dsc file (%s), not properly utf-8 encoded" % f) + count += 1 + except CantOpenError: + utils.warn("missing dsc file (%s)" % f) + count += 1 + except Exception as e: + utils.warn("miscellaneous error parsing dsc file (%s): %s" % (f, str(e))) + count += 1 if count: utils.warn("Found %s invalid .dsc files." % (count)) @@ -339,7 +338,7 @@ def check_files_in_dsc(): try: # NB: don't enforce .dsc syntax - dsc = utils.parse_changes(filename) + dsc = utils.parse_changes(filename, dsc_file=1) except: utils.fubar("error parsing .dsc file '%s'." % (filename)) @@ -426,7 +425,7 @@ def check_indices_files_exist(): Ensure files mentioned in Packages & Sources exist """ for suite in [ "stable", "testing", "unstable" ]: - for component in Cnf.ValueList("Suite::%s::Components" % (suite)): + for component in get_component_names(): architectures = get_suite_architectures(suite) for arch in [ i.arch_string.lower() for i in architectures ]: if arch == "source": @@ -461,7 +460,7 @@ def chk_bd_process_dir (unused, dirname, filenames): if not name.endswith(".dsc"): continue filename = os.path.abspath(dirname+'/'+name) - dsc = utils.parse_changes(filename) + dsc = utils.parse_changes(filename, dsc_file=1) for field_name in [ "build-depends", "build-depends-indep" ]: field = dsc.get(field_name) if field: @@ -480,6 +479,17 @@ def check_build_depends(): ################################################################################ +def add_missing_source_checksums(): + """ Add missing source checksums to source_metadata """ + session = DBConn().session() + for checksum in ['Files', 'Checksums-Sha1', 'Checksums-Sha256']: + rows = session.execute('SELECT source_metadata_add_missing_checksum(:type)', {'type': checksum}).scalar() + if rows > 0: + print "Added {0} missing entries for {1}".format(rows, checksum) + session.commit() + +################################################################################ + def main (): global db_files, waste, excluded @@ -527,6 +537,8 @@ def main (): check_files_not_symlinks() elif mode == "validate-builddeps": check_build_depends() + elif mode == "add-missing-source-checksums": + add_missing_source_checksums() else: utils.warn("unknown mode '%s'" % (mode)) usage(1)