X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=jennifer;h=bb1fff7df646f014c5f7dac539fb72a23068d19f;hb=e7556dca76d2e8249fb7c8ddb1ce99a3c0211b32;hp=14b5b6802481a0433abca0bd22357869cc060d92;hpb=f2f237c936b5d5727c2b70be85cdacd2903c05b2;p=dak.git diff --git a/jennifer b/jennifer index 14b5b680..bb1fff7d 100755 --- a/jennifer +++ b/jennifer @@ -2,7 +2,7 @@ # Checks Debian packages from Incoming # Copyright (C) 2000, 2001, 2002, 2003, 2004 James Troup -# $Id: jennifer,v 1.47 2004-04-03 02:49:46 troup Exp $ +# $Id: jennifer,v 1.51 2004-06-17 15:01:18 troup Exp $ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -37,8 +37,6 @@ from types import *; ################################################################################ -re_bad_diff = re.compile("^[\-\+][\-\+][\-\+] /dev/null"); -re_is_changes = re.compile(r"(.+?)_(.+?)_(.+?)\.changes$"); re_valid_version = re.compile(r"^([0-9]+:)?[0-9A-Za-z\.\-\+:]+$"); re_valid_pkg_name = re.compile(r"^[\dA-Za-z][\dA-Za-z\+\-\.]+$"); re_changelog_versions = re.compile(r"^\w[-+0-9a-z.]+ \([^\(\) \t]+\)"); @@ -47,7 +45,7 @@ re_strip_revision = re.compile(r"-([^-]+)$"); ################################################################################ # Globals -jennifer_version = "$Revision: 1.47 $"; +jennifer_version = "$Revision: 1.51 $"; Cnf = None; Options = None; @@ -323,6 +321,24 @@ def check_files(): copy_to_holding(file); os.chdir(cwd); + # Check there isn't already a .changes or .katie file of the same name in + # the proposed-updates "CopyChanges" or "CopyKatie" storage directories. + # [NB: this check must be done post-suite mapping] + base_filename = os.path.basename(pkg.changes_file); + katie_filename = base_filename[:-8]+".katie" + for suite in changes["distribution"].keys(): + copychanges = "Suite::%s::CopyChanges" % (suite); + if Cnf.has_key(copychanges) and \ + os.path.exists(Cnf[copychanges]+"/"+base_filename): + reject("%s: a file with this name already exists in %s" \ + % (base_filename, Cnf[copychanges])); + + copykatie = "Suite::%s::CopyKatie" % (suite); + if Cnf.has_key(copykatie) and \ + os.path.exists(Cnf[copykatie]+"/"+katie_filename): + reject("%s: a file with this name already exists in %s" \ + % (katie_filename, Cnf[copykatie])); + reprocess = 0; has_binaries = 0; has_source = 0; @@ -583,7 +599,7 @@ def check_dsc(): # Ensure there is source to check if not changes["architecture"].has_key("source"): - return; + return 1; # Find the .dsc dsc_filename = None; @@ -591,13 +607,13 @@ def check_dsc(): if files[file]["type"] == "dsc": if dsc_filename: reject("can not process a .changes file with multiple .dsc's."); - return; + return 0; else: dsc_filename = file; # If there isn't one, we have nothing to do. (We have reject()ed the upload already) if not dsc_filename: - return; + return 0; # Parse the .dsc file try: @@ -615,16 +631,16 @@ def check_dsc(): dsc_files.update(utils.build_file_list(dsc, is_a_dsc=1)); except utils.no_files_exc: reject("%s: no Files: field." % (dsc_filename)); - return; + return 0; except utils.changes_parse_error_exc, line: reject("%s: parse error, can't grok: %s." % (dsc_filename, line)); - return; + return 0; # Enforce mandatory fields for i in ("format", "source", "version", "binary", "maintainer", "architecture", "files"): if not dsc.has_key(i): reject("%s: missing mandatory field `%s'." % (dsc_filename, i)); - return; + return 0; # Validate the source and version fields if not re_valid_pkg_name.match(dsc["source"]): @@ -695,6 +711,8 @@ def check_dsc(): files[orig_tar_gz]["type"] = "orig.tar.gz"; reprocess = 2; + return 1; + ################################################################################ def get_changelog_versions(source_dir): @@ -794,7 +812,22 @@ def check_source(): # Move back and cleanup the temporary tree os.chdir(cwd); - shutil.rmtree(tmpdir); + try: + shutil.rmtree(tmpdir); + except OSError, e: + if errno.errorcode[e.errno] != 'EACCES': + utils.fubar("%s: couldn't remove tmp dir for source tree." % (dsc["source"])); + + reject("%s: source tree could not be cleanly removed." % (dsc["source"])); + # We probably have u-r or u-w directories so chmod everything + # and try again. + cmd = "chmod -R u+rwx %s" % (tmpdir) + result = os.system(cmd) + if result != 0: + utils.fubar("'%s' failed with result %s." % (cmd, result)); + shutil.rmtree(tmpdir); + except: + utils.fubar("%s: couldn't remove tmp dir for source tree." % (dsc["source"])); ################################################################################ @@ -1096,13 +1129,14 @@ def process_it (changes_file): # rather than the original... pkg.changes_file = os.path.basename(pkg.changes_file); changes["fingerprint"] = utils.check_signature(pkg.changes_file, reject); - changes_valid = check_changes(); - if changes_valid: + valid_changes_p = check_changes(); + if valid_changes_p: while reprocess: check_distributions(); check_files(); - check_dsc(); - check_source(); + valid_dsc_p = check_dsc(); + if valid_dsc_p: + check_source(); check_md5sums(); check_urgency(); check_timestamps();