-#########################################################################################
-
-def check_signature (filename):
- global reject_message
-
- (result, output) = commands.getstatusoutput("gpg --emulate-md-encode-bug --batch --no-options --no-default-keyring --always-trust --keyring=%s --keyring=%s < %s >/dev/null" % (Cnf["Dinstall::PGPKeyring"], Cnf["Dinstall::GPGKeyring"], filename))
- if (result != 0):
- reject_message = reject_message + "Rejected: GPG signature check failed on `%s'.\n%s\n" % (os.path.basename(filename), output)
- return 0
- return 1
-
-######################################################################################################
-
-class nmu_p:
- # Read in the group maintainer override file
- def __init__ (self):
- self.group_maint = {};
- if Cnf.get("Dinstall::GroupOverrideFilename"):
- filename = Cnf["Dir::OverrideDir"] + Cnf["Dinstall::GroupOverrideFilename"];
- file = utils.open_file(filename);
- for line in file.readlines():
- line = string.strip(utils.re_comments.sub('', line));
- if line != "":
- self.group_maint[line] = 1;
- file.close();
-
- def is_an_nmu (self, changes, dsc):
- (dsc_rfc822, dsc_name, dsc_email) = utils.fix_maintainer (dsc.get("maintainer",Cnf["Dinstall::MyEmailAddress"]));
- # changes["changedbyname"] == dsc_name is probably never true, but better safe than sorry
- if dsc_name == changes["maintainername"] and (changes["changedby822"] == "" or changes["changedbyname"] == dsc_name):
- return 0;
-
- if dsc.has_key("uploaders"):
- uploaders = string.split(dsc["uploaders"], ",");
- uploadernames = {};
- for i in uploaders:
- (rfc822, name, email) = utils.fix_maintainer (string.strip(i));
- uploadernames[name] = "";
- if uploadernames.has_key(changes["changedbyname"]):
- return 0;
-
- # Some group maintained packages (e.g. Debian QA) are never NMU's
- if self.group_maint.has_key(changes["maintaineremail"]):
- return 0;
-
- return 1;
-
-######################################################################################################
-
-# Ensure that source exists somewhere in the archive for the binary
-# upload being processed.
-#
-# (1) exact match => 1.0-3
-# (2) Bin-only NMU of an MU => 1.0-3.0.1
-# (3) Bin-only NMU of a sourceful-NMU => 1.0-3.1.1
-
-def source_exists (package, source_version):
- q = projectB.query("SELECT s.version FROM source s WHERE s.source = '%s'" % (package));
-
- # Reduce the query results to a list of version numbers
- ql = map(lambda x: x[0], q.getresult());
-
- # Try (1)
- if ql.count(source_version):
- return 1;
-
- # Try (2)
- orig_source_version = re_bin_only_nmu_of_mu.sub('', source_version);
- if ql.count(orig_source_version):
- return 1;
-
- # Try (3)
- orig_source_version = re_bin_only_nmu_of_nmu.sub('', source_version);
- if ql.count(orig_source_version):
- return 1;
-
- # No source found...
- return 0;
-
-######################################################################################################
-
-# See if a given package is in the override table
-
-def in_override_p (package, component, suite, binary_type, file):
- global files;
-
- if binary_type == "": # must be source
- type = "dsc";
- else:
- type = binary_type;
-
- # Override suite name; used for example with proposed-updates
- if Cnf.Find("Suite::%s::OverrideSuite" % (suite)) != "":
- suite = Cnf["Suite::%s::OverrideSuite" % (suite)];
-
- # Avoid <undef> on unknown distributions
- suite_id = db_access.get_suite_id(suite);
- if suite_id == -1:
- return None;
- component_id = db_access.get_component_id(component);
- type_id = db_access.get_override_type_id(type);
-
- # FIXME: nasty non-US speficic hack
- if string.lower(component[:7]) == "non-us/":
- component = component[7:];
-
- q = projectB.query("SELECT s.section, p.priority FROM override o, section s, priority p WHERE package = '%s' AND suite = %s AND component = %s AND type = %s AND o.section = s.id AND o.priority = p.id"
- % (package, suite_id, component_id, type_id));
- result = q.getresult();
- # If checking for a source package fall back on the binary override type
- if type == "dsc" and not result:
- type_id = db_access.get_override_type_id("deb");
- q = projectB.query("SELECT s.section, p.priority FROM override o, section s, priority p WHERE package = '%s' AND suite = %s AND component = %s AND type = %s AND o.section = s.id AND o.priority = p.id"
- % (package, suite_id, component_id, type_id));
- result = q.getresult();
-
- # Remember the section and priority so we can check them later if appropriate
- if result != []:
- files[file]["override section"] = result[0][0];
- files[file]["override priority"] = result[0][1];
-
- return result;
-
-#####################################################################################################################
-
-def check_changes(filename):
- global reject_message, changes, files
-
- # Default in case we bail out
- changes["maintainer822"] = Cnf["Dinstall::MyEmailAddress"];
- changes["changedby822"] = Cnf["Dinstall::MyEmailAddress"];
- changes["architecture"] = {};
-
- # Parse the .changes field into a dictionary
- try:
- changes = utils.parse_changes(filename, 0)
- except utils.cant_open_exc:
- reject_message = reject_message + "Rejected: can't read changes file '%s'.\n" % (filename)
- return 0;
- except utils.changes_parse_error_exc, line:
- reject_message = reject_message + "Rejected: error parsing changes file '%s', can't grok: %s.\n" % (filename, line)
- return 0;
-
- # Parse the Files field from the .changes into another dictionary
- try:
- files = utils.build_file_list(changes, "");
- except utils.changes_parse_error_exc, line:
- reject_message = reject_message + "Rejected: error parsing changes file '%s', can't grok: %s.\n" % (filename, line);
- except utils.nk_format_exc, format:
- reject_message = reject_message + "Rejected: unknown format '%s' of changes file '%s'.\n" % (format, filename);
- return 0;
-
- # Check for mandatory fields
- for i in ("source", "binary", "architecture", "version", "distribution", "maintainer", "files"):
- if not changes.has_key(i):
- reject_message = reject_message + "Rejected: Missing field `%s' in changes file.\n" % (i)
- return 0 # Avoid <undef> errors during later tests
-
- # Override the Distribution: field if appropriate
- if Options["Override-Distribution"] != "":
- reject_message = reject_message + "Warning: Distribution was overriden from %s to %s.\n" % (changes["distribution"], Options["Override-Distribution"])
- changes["distribution"] = Options["Override-Distribution"]
-
- # Split multi-value fields into a lower-level dictionary
- for i in ("architecture", "distribution", "binary", "closes"):
- o = changes.get(i, "")
- if o != "":
- del changes[i]
- changes[i] = {}
- for j in string.split(o):
- changes[i][j] = 1
-
- # Fix the Maintainer: field to be RFC822 compatible
- (changes["maintainer822"], changes["maintainername"], changes["maintaineremail"]) = utils.fix_maintainer (changes["maintainer"])
-
- # Fix the Changed-By: field to be RFC822 compatible; if it exists.
- (changes["changedby822"], changes["changedbyname"], changes["changedbyemail"]) = utils.fix_maintainer(changes.get("changed-by",""));
-
- # Ensure all the values in Closes: are numbers
- if changes.has_key("closes"):
- for i in changes["closes"].keys():
- if re_isanum.match (i) == None:
- reject_message = reject_message + "Rejected: `%s' from Closes field isn't a number.\n" % (i)
-
- # Ensure there _is_ a target distribution
- if not changes["distribution"].keys():
- reject_message = reject_message + "Rejected: huh? Distribution field is empty in changes file.\n";
-
- # Map frozen to unstable if frozen doesn't exist
- if changes["distribution"].has_key("frozen") and not Cnf.has_key("Suite::Frozen"):
- del changes["distribution"]["frozen"]
- changes["distribution"]["unstable"] = 1;
- reject_message = reject_message + "Mapping frozen to unstable.\n"
-
- # Map testing to unstable
- if changes["distribution"].has_key("testing"):
- if len(changes["distribution"].keys()) > 1:
- del changes["distribution"]["testing"];
- reject_message = reject_message + "Warning: Ignoring testing as a target suite.\n";
- else:
- reject_message = reject_message + "Rejected: invalid distribution 'testing'.\n";
-
- # Ensure target distributions exist
- for i in changes["distribution"].keys():
- if not Cnf.has_key("Suite::%s" % (i)):
- reject_message = reject_message + "Rejected: Unknown distribution `%s'.\n" % (i)
-
- # Map unreleased arches from stable to unstable
- if changes["distribution"].has_key("stable"):
- for i in changes["architecture"].keys():
- if not Cnf.has_key("Suite::Stable::Architectures::%s" % (i)):
- reject_message = reject_message + "Mapping stable to unstable for unreleased arch `%s'.\n" % (i)
- del changes["distribution"]["stable"]
- changes["distribution"]["unstable"] = 1;
-
- # Map arches not being released from frozen to unstable
- if changes["distribution"].has_key("frozen"):
- for i in changes["architecture"].keys():
- if not Cnf.has_key("Suite::Frozen::Architectures::%s" % (i)):
- reject_message = reject_message + "Mapping frozen to unstable for non-releasing arch `%s'.\n" % (i)
- del changes["distribution"]["frozen"]
- changes["distribution"]["unstable"] = 1;
-
- # Handle uploads to stable
- if changes["distribution"].has_key("stable"):
- # If running from within proposed-updates; assume an install to stable
- if string.find(os.getcwd(), 'proposed-updates') != -1:
- # Remove non-stable target distributions
- for dist in changes["distribution"].keys():
- if dist != "stable":
- reject_message = reject_message + "Removing %s from distribution list.\n" % (dist);
- del changes["distribution"][dist];
- changes["stable install"] = 1;
- # If we can't find a file from the .changes; assume it's a package already in the pool and move into the pool
- file = files.keys()[0];
- if os.access(file, os.R_OK) == 0:
- pool_dir = Cnf["Dir::PoolDir"] + '/' + utils.poolify(changes["source"], files[file]["component"]);
- changes["installing from the pool"] = 1;
- os.chdir(pool_dir);
- # Otherwise (normal case) map stable to updates
- else:
- 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:
- if os.path.exists(file):
- reject_message = reject_message + "Rejected: Can't read `%s'. [permission denied]\n" % (file)
- else:
- reject_message = reject_message + "Rejected: Can't read `%s'. [file not found]\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 utils.re_isadeb.match(file) != None:
- files[file]["type"] = "deb";
-
- # Extract package information using dpkg-deb
- try:
- control = apt_pkg.ParseSection(apt_inst.debExtractControl(utils.open_file(file)));
- except:
- reject_message = reject_message + "Rejected: %s: debExtractControl() raised %s.\n" % (file, sys.exc_type);
- # Can't continue, none of the checks on control would work.
- continue;
-
- # 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]["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"];
- # Get the source version
- source = files[file]["source"];
- source_version = ""
- if string.find(source, "(") != -1:
- m = utils.re_extract_src_version.match(source)
- source = m.group(1)
- source_version = m.group(2)
- if not source_version:
- source_version = files[file]["version"];
- files[file]["source package"] = source;
- files[file]["source version"] = source_version;
-
- # Checks for a source package...
- else:
- m = utils.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
- files[file]["architecture"] = "source";
-
- # 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",""), file):
- files[file]["new"] = 1
-
- if files[file]["type"] == "deb":
- # Find any old binary packages
- 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' OR a.arch_string = 'all') 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:
- reject_message = reject_message + "Rejected: %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 install"):
- 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)
-
- # Check for existent source
- # FIXME: this is no longer per suite
- if changes["architecture"].has_key("source"):
- source_version = files[file]["source version"];
- if source_version != changes["version"]:
- reject_message = reject_message + "Rejected: source version (%s) for %s doesn't match changes version %s.\n" % (files[file]["source version"], file, changes["version"]);
- else:
- if not source_exists (files[file]["source package"], source_version):
- reject_message = reject_message + "Rejected: no source found for %s %s (%s).\n" % (files[file]["source package"], source_version, 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;
-
- # Validate the priority
- if string.find(files[file]["priority"],'/') != -1:
- reject_message = reject_message + "Rejected: file '%s' has invalid priority '%s' [contains '/'].\n" % (file, files[file]["priority"]);
-
- # 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
-
-###############################################################################
-
-def check_dsc ():
- global dsc, dsc_files, reject_message, reprocess, orig_tar_id, orig_tar_location, legacy_source_untouchable;
-
- for file in files.keys():
- if files[file]["type"] == "dsc":
- try:
- dsc = utils.parse_changes(file, 1)
- except utils.cant_open_exc:
- reject_message = reject_message + "Rejected: can't read changes file '%s'.\n" % (file)
- return 0;
- except utils.changes_parse_error_exc, line:
- reject_message = reject_message + "Rejected: error parsing changes file '%s', can't grok: %s.\n" % (file, line)
- return 0;
- except utils.invalid_dsc_format_exc, line:
- reject_message = reject_message + "Rejected: syntax error in .dsc file '%s', line %s.\n" % (file, line)
- return 0;
- try:
- dsc_files = utils.build_file_list(dsc, 1)
- except utils.no_files_exc:
- reject_message = reject_message + "Rejected: no Files: field in .dsc file.\n";
- continue;
- except utils.changes_parse_error_exc, line:
- reject_message = reject_message + "Rejected: error parsing .dsc file '%s', can't grok: %s.\n" % (file, line);
- continue;
-
- # Enforce mandatory fields
- for i in ("format", "source", "version", "binary", "maintainer", "architecture", "files"):
- if not dsc.has_key(i):
- reject_message = reject_message + "Rejected: Missing field `%s' in dsc file.\n" % (i)
-
- # The dpkg maintainer from hell strikes again! Bumping the
- # version number of the .dsc breaks extraction by stable's
- # dpkg-source.
- if dsc["format"] != "1.0":
- reject_message = reject_message + """Rejected: [dpkg-sucks] source package was produced by a broken version
- of dpkg-dev 1.9.1{3,4}; please rebuild with >= 1.9.15 version
- installed.
-""";
-
- # Ensure the version number in the .dsc matches the version number in the .changes
- epochless_dsc_version = utils.re_no_epoch.sub('', dsc.get("version"));
- changes_version = files[file]["version"];
- if epochless_dsc_version != files[file]["version"]:
- reject_message = reject_message + "Rejected: version ('%s') in .dsc does not match version ('%s') in .changes\n" % (epochless_dsc_version, changes_version);
-
- # Ensure source is newer than existing source in target suites
- package = dsc.get("source");
- new_version = dsc.get("version");
- for suite in changes["distribution"].keys():
- q = projectB.query("SELECT s.version FROM source s, src_associations sa, suite su WHERE s.source = '%s' AND su.suite_name = '%s' AND sa.source = s.id AND sa.suite = su.id"
- % (package, suite));
- ql = map(lambda x: x[0], q.getresult());
- for old_version in ql:
- if apt_pkg.VersionCompare(new_version, old_version) != 1:
- reject_message = reject_message + "Rejected: %s Old version `%s' >= new version `%s'.\n" % (file, old_version, new_version)
-
- # Try and find all files mentioned in the .dsc. This has
- # to work harder to cope with the multiple possible
- # locations of an .orig.tar.gz.
- for dsc_file in dsc_files.keys():
- if files.has_key(dsc_file):
- actual_md5 = files[dsc_file]["md5sum"];
- actual_size = int(files[dsc_file]["size"]);
- found = "%s in incoming" % (dsc_file)
- # Check the file does not already exist in the archive
- if not changes.has_key("stable install"):
- q = projectB.query("SELECT f.id FROM files f, location l WHERE (f.filename ~ '/%s$' OR f.filename = '%s') AND l.id = f.location" % (utils.regex_safe(dsc_file), dsc_file));
-
- # "It has not broken them. It has fixed a
- # brokenness. Your crappy hack exploited a
- # bug in the old dinstall.
- #
- # "(Come on! I thought it was always obvious
- # that one just doesn't release different
- # files with the same name and version.)"
- # -- ajk@ on d-devel@l.d.o
-
- if q.getresult() != []:
- reject_message = reject_message + "Rejected: can not overwrite existing copy of '%s' already in the archive.\n" % (dsc_file)
- elif dsc_file[-12:] == ".orig.tar.gz":
- # Check in the pool
- q = projectB.query("SELECT l.path, f.filename, l.type, f.id, l.id FROM files f, location l WHERE (f.filename ~ '/%s$' OR f.filename = '%s') AND l.id = f.location" % (utils.regex_safe(dsc_file), dsc_file));
- ql = q.getresult();
-
- if ql != []:
- # Unfortunately, we make get more than one match
- # here if, for example, the package was in potato
- # but had a -sa upload in woody. So we need to a)
- # choose the right one and b) mark all wrong ones
- # as excluded from the source poolification (to
- # avoid file overwrites).
-
- x = ql[0]; # default to something sane in case we don't match any or have only one
-
- if len(ql) > 1:
- for i in ql:
- old_file = i[0] + i[1];
- actual_md5 = apt_pkg.md5sum(utils.open_file(old_file));
- actual_size = os.stat(old_file)[stat.ST_SIZE];
- if actual_md5 == dsc_files[dsc_file]["md5sum"] and actual_size == int(dsc_files[dsc_file]["size"]):
- x = i;
- else:
- legacy_source_untouchable[i[3]] = "";
-
- old_file = x[0] + x[1];
- actual_md5 = apt_pkg.md5sum(utils.open_file(old_file));
- actual_size = os.stat(old_file)[stat.ST_SIZE];
- found = old_file;
- suite_type = x[2];
- dsc_files[dsc_file]["files id"] = x[3]; # need this for updating dsc_files in install()
- # See install()...
- orig_tar_id = x[3];
- if suite_type == "legacy" or suite_type == "legacy-mixed":
- orig_tar_location = "legacy";
- else:
- orig_tar_location = x[4];
- else:
- # Not there? Check in Incoming...
- # [See comment above process_it() for explanation
- # of why this is necessary...]
- if os.path.exists(dsc_file):
- files[dsc_file] = {};
- files[dsc_file]["size"] = os.stat(dsc_file)[stat.ST_SIZE];
- files[dsc_file]["md5sum"] = dsc_files[dsc_file]["md5sum"];
- files[dsc_file]["section"] = files[file]["section"];
- files[dsc_file]["priority"] = files[file]["priority"];
- files[dsc_file]["component"] = files[file]["component"];
- files[dsc_file]["type"] = "orig.tar.gz";
- reprocess = 1;
- return 1;
- else:
- reject_message = reject_message + "Rejected: %s refers to %s, but I can't find it in Incoming or in the pool.\n" % (file, dsc_file);
- continue;
- else:
- reject_message = reject_message + "Rejected: %s refers to %s, but I can't find it in Incoming.\n" % (file, dsc_file);
- continue;
- if actual_md5 != dsc_files[dsc_file]["md5sum"]:
- reject_message = reject_message + "Rejected: md5sum for %s doesn't match %s.\n" % (found, file);
- if actual_size != int(dsc_files[dsc_file]["size"]):
- reject_message = reject_message + "Rejected: size for %s doesn't match %s.\n" % (found, file);
-
- if string.find(reject_message, "Rejected:") != -1:
- return 0
- else:
- return 1
-