# Checks Debian packages from Incoming
# Copyright (C) 2000, 2001, 2002, 2003, 2004 James Troup <james@nocrew.org>
-# $Id: jennifer,v 1.48 2004-04-19 16:04:34 troup Exp $
+# $Id: jennifer,v 1.52 2004-11-27 13:32:16 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
################################################################################
-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]+\)");
################################################################################
# Globals
-jennifer_version = "$Revision: 1.48 $";
+jennifer_version = "$Revision: 1.52 $";
Cnf = None;
Options = None;
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;
if files[file]["component"] == source:
files[file]["original component"] = source;
files[file]["component"] = dest;
+
# Ensure the component is valid for the target suite
if Cnf.has_key("Suite:%s::Components" % (suite)) and \
files[file]["component"] not in Cnf.ValueList("Suite::%s::Components" % (suite)):
reject("unknown component `%s' for suite `%s'." % (files[file]["component"], suite));
continue;
- # See if the package is NEW
- if not Katie.in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype",""), file):
- files[file]["new"] = 1;
-
# Validate the component
component = files[file]["component"];
component_id = db_access.get_component_id(component);
reject("file '%s' has unknown component '%s'." % (file, component));
continue;
+ # See if the package is NEW
+ if not Katie.in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype",""), file):
+ files[file]["new"] = 1;
+
# Validate the priority
if files[file]["priority"].find('/') != -1:
reject("file '%s' has invalid priority '%s' [contains '/']." % (file, files[file]["priority"]));
# Ensure there is source to check
if not changes["architecture"].has_key("source"):
- return;
+ return 1;
# Find the .dsc
dsc_filename = None;
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:
- dsc.update(utils.parse_changes(dsc_filename, dsc_whitespace_rules=1));
+ dsc.update(utils.parse_changes(dsc_filename, signing_rules=1));
except utils.cant_open_exc:
# if not -n copy_to_holding() will have done this for us...
if Options["No-Action"]:
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"]):
files[orig_tar_gz]["type"] = "orig.tar.gz";
reprocess = 2;
+ return 1;
+
################################################################################
def get_changelog_versions(source_dir):
# 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();