- reject_message = reject_message + "Mapping stable to updates.\n";
- del changes["distribution"]["stable"];
- changes["distribution"]["proposed-updates"] = 1;
-
- # chopversion = no epoch; chopversion2 = no epoch and no revision (e.g. for .orig.tar.gz comparison)
- changes["chopversion"] = utils.re_no_epoch.sub('', changes["version"])
- changes["chopversion2"] = utils.re_no_revision.sub('', changes["chopversion"])
-
- if string.find(reject_message, "Rejected:") != -1:
- return 0
- else:
- return 1
-
-def check_files():
- global reject_message
-
- archive = utils.where_am_i();
-
- for file in files.keys():
- # Check the file is readable
- if os.access(file,os.R_OK) == 0:
- reject_message = reject_message + "Rejected: Can't read `%s'.\n" % (file)
- files[file]["type"] = "unreadable";
- continue
- # If it's byhand skip remaining checks
- if files[file]["section"] == "byhand":
- files[file]["byhand"] = 1;
- files[file]["type"] = "byhand";
- # Checks for a binary package...
- elif re_isadeb.match(file) != None:
- # Extract package information using dpkg-deb
- control = apt_pkg.ParseSection(apt_inst.debExtractControl(utils.open_file(file,"r")))
-
- # Check for mandatory fields
- if control.Find("Package") == None:
- reject_message = reject_message + "Rejected: %s: No package field in control.\n" % (file)
- if control.Find("Architecture") == None:
- reject_message = reject_message + "Rejected: %s: No architecture field in control.\n" % (file)
- if control.Find("Version") == None:
- reject_message = reject_message + "Rejected: %s: No version field in control.\n" % (file)
-
- # Ensure the package name matches the one give in the .changes
- if not changes["binary"].has_key(control.Find("Package", "")):
- reject_message = reject_message + "Rejected: %s: control file lists name as `%s', which isn't in changes file.\n" % (file, control.Find("Package", ""))
-
- # Validate the architecture
- if not Cnf.has_key("Suite::Unstable::Architectures::%s" % (control.Find("Architecture", ""))):
- reject_message = reject_message + "Rejected: Unknown architecture '%s'.\n" % (control.Find("Architecture", ""))
-
- # Check the architecture matches the one given in the .changes
- if not changes["architecture"].has_key(control.Find("Architecture", "")):
- reject_message = reject_message + "Rejected: %s: control file lists arch as `%s', which isn't in changes file.\n" % (file, control.Find("Architecture", ""))
- # Check the section & priority match those given in the .changes (non-fatal)
- if control.Find("Section") != None and files[file]["section"] != "" and files[file]["section"] != control.Find("Section"):
- reject_message = reject_message + "Warning: %s control file lists section as `%s', but changes file has `%s'.\n" % (file, control.Find("Section", ""), files[file]["section"])
- if control.Find("Priority") != None and files[file]["priority"] != "" and files[file]["priority"] != control.Find("Priority"):
- reject_message = reject_message + "Warning: %s control file lists priority as `%s', but changes file has `%s'.\n" % (file, control.Find("Priority", ""), files[file]["priority"])
-
- epochless_version = utils.re_no_epoch.sub('', control.Find("Version", ""))
-
- files[file]["package"] = control.Find("Package");
- files[file]["architecture"] = control.Find("Architecture");
- files[file]["version"] = control.Find("Version");
- files[file]["maintainer"] = control.Find("Maintainer", "");
- if file[-5:] == ".udeb":
- files[file]["dbtype"] = "udeb";
- elif file[-4:] == ".deb":
- files[file]["dbtype"] = "deb";
- else:
- reject_message = reject_message + "Rejected: %s is neither a .deb or a .udeb.\n " % (file);
- files[file]["type"] = "deb";
- files[file]["fullname"] = "%s_%s_%s.deb" % (control.Find("Package", ""), epochless_version, control.Find("Architecture", ""))
- files[file]["source"] = control.Find("Source", "");
- if files[file]["source"] == "":
- files[file]["source"] = files[file]["package"];
- # Checks for a source package...
- else:
- m = re_issource.match(file)
- if m != None:
- files[file]["package"] = m.group(1)
- files[file]["version"] = m.group(2)
- files[file]["type"] = m.group(3)
-
- # Ensure the source package name matches the Source filed in the .changes
- if changes["source"] != files[file]["package"]:
- reject_message = reject_message + "Rejected: %s: changes file doesn't say %s for Source\n" % (file, files[file]["package"])
-
- # Ensure the source version matches the version in the .changes file
- if files[file]["type"] == "orig.tar.gz":
- changes_version = changes["chopversion2"]
- else:
- changes_version = changes["chopversion"]
- if changes_version != files[file]["version"]:
- reject_message = reject_message + "Rejected: %s: should be %s according to changes file.\n" % (file, changes_version)
-
- # Ensure the .changes lists source in the Architecture field
- if not changes["architecture"].has_key("source"):
- reject_message = reject_message + "Rejected: %s: changes file doesn't list `source' in Architecture field.\n" % (file)
-
- # Check the signature of a .dsc file
- if files[file]["type"] == "dsc":
- check_signature(file)
-
- files[file]["fullname"] = file
-
- # Not a binary or source package? Assume byhand...
- else:
- files[file]["byhand"] = 1;
- files[file]["type"] = "byhand";
-
- files[file]["oldfiles"] = {}
- for suite in changes["distribution"].keys():
- # Skip byhand
- if files[file].has_key("byhand"):
- continue
-
- if Cnf.has_key("Suite:%s::Components" % (suite)) and not Cnf.has_key("Suite::%s::Components::%s" % (suite, files[file]["component"])):
- reject_message = reject_message + "Rejected: unknown component `%s' for suite `%s'.\n" % (files[file]["component"], suite)
- continue
-
- # See if the package is NEW
- if not in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype","")):
- files[file]["new"] = 1
-
- # Find any old binary packages
- if files[file]["type"] == "deb":
- q = projectB.query("SELECT b.id, b.version, f.filename, l.path, c.name FROM binaries b, bin_associations ba, suite s, location l, component c, architecture a, files f WHERE b.package = '%s' AND s.suite_name = '%s' AND a.arch_string = '%s' AND ba.bin = b.id AND ba.suite = s.id AND b.architecture = a.id AND f.location = l.id AND l.component = c.id AND b.file = f.id"
- % (files[file]["package"], suite, files[file]["architecture"]))
- oldfiles = q.dictresult()
- for oldfile in oldfiles:
- files[file]["oldfiles"][suite] = oldfile
- # Check versions [NB: per-suite only; no cross-suite checking done (yet)]
- if apt_pkg.VersionCompare(files[file]["version"], oldfile["version"]) != 1:
- if Cnf["Dinstall::Options::No-Version-Check"]:
- reject_message = reject_message + "Overriden rejection"
- else:
- reject_message = reject_message + "Rejected"
- reject_message = reject_message + ": %s Old version `%s' >= new version `%s'.\n" % (file, oldfile["version"], files[file]["version"])
- # Check for existing copies of the file
- if not changes.has_key("stable upload"):
- q = projectB.query("SELECT b.id FROM binaries b, architecture a WHERE b.package = '%s' AND b.version = '%s' AND a.arch_string = '%s' AND a.id = b.architecture" % (files[file]["package"], files[file]["version"], files[file]["architecture"]))
- if q.getresult() != []:
- reject_message = reject_message + "Rejected: can not overwrite existing copy of '%s' already in the archive.\n" % (file)
-
- # Find any old .dsc files
- elif files[file]["type"] == "dsc":
- q = projectB.query("SELECT s.id, s.version, f.filename, l.path, c.name FROM source s, src_associations sa, suite su, location l, component c, files f WHERE s.source = '%s' AND su.suite_name = '%s' AND sa.source = s.id AND sa.suite = su.id AND f.location = l.id AND l.component = c.id AND f.id = s.file"
- % (files[file]["package"], suite))
- oldfiles = q.dictresult()
- if len(oldfiles) >= 1:
- files[file]["oldfiles"][suite] = oldfiles[0]
-
- # Validate the component
- component = files[file]["component"];
- component_id = db_access.get_component_id(component);
- if component_id == -1:
- reject_message = reject_message + "Rejected: file '%s' has unknown component '%s'.\n" % (file, component);
- continue;
-
- # Check the md5sum & size against existing files (if any)
- location = Cnf["Dir::PoolDir"];
- files[file]["location id"] = db_access.get_location_id (location, component, archive);
-
- files[file]["pool name"] = utils.poolify (changes["source"], files[file]["component"]);
- files_id = db_access.get_files_id(files[file]["pool name"] + file, files[file]["size"], files[file]["md5sum"], files[file]["location id"]);
- if files_id == -1:
- reject_message = reject_message + "Rejected: INTERNAL ERROR, get_files_id() returned multiple matches for %s.\n" % (file)
- elif files_id == -2:
- reject_message = reject_message + "Rejected: md5sum and/or size mismatch on existing copy of %s.\n" % (file)
- files[file]["files id"] = files_id
-
- # Check for packages that have moved from one component to another
- if files[file]["oldfiles"].has_key(suite) and files[file]["oldfiles"][suite]["name"] != files[file]["component"]:
- files[file]["othercomponents"] = files[file]["oldfiles"][suite]["name"];
-
-
- if string.find(reject_message, "Rejected:") != -1:
- return 0
- else:
- return 1