+
+################################################################################
+
+def validate_sources(suite, component):
+ filename = "%s/dists/%s/%s/source/Sources.gz" % (Cnf["Dir::Root"], suite, component);
+ print "Processing %s..." % (filename);
+ # apt_pkg.ParseTagFile needs a real file handle and can't handle a GzipFile instance...
+ temp_filename = utils.temp_filename();
+ (result, output) = commands.getstatusoutput("gunzip -c %s > %s" % (filename, temp_filename));
+ if (result != 0):
+ sys.stderr.write("Gunzip invocation failed!\n%s\n" % (output));
+ sys.exit(result);
+ sources = utils.open_file(temp_filename);
+ Sources = apt_pkg.ParseTagFile(sources);
+ while Sources.Step():
+ source = Sources.Section.Find('Package');
+ directory = Sources.Section.Find('Directory');
+ files = Sources.Section.Find('Files');
+ for i in files.split('\n'):
+ (md5, size, name) = i.split();
+ filename = "%s/%s/%s" % (Cnf["Dir::Root"], directory, name);
+ if not os.path.exists(filename):
+ if directory.find("potato") == -1:
+ print "W: %s missing." % (filename);
+ else:
+ pool_location = utils.poolify (source, component);
+ pool_filename = "%s/%s/%s" % (Cnf["Dir::Pool"], pool_location, name);
+ if not os.path.exists(pool_filename):
+ print "E: %s missing (%s)." % (filename, pool_filename);
+ else:
+ # Create symlink
+ pool_filename = os.path.normpath(pool_filename);
+ filename = os.path.normpath(filename);
+ src = utils.clean_symlink(pool_filename, filename, Cnf["Dir::Root"]);
+ print "Symlinking: %s -> %s" % (filename, src);
+ #os.symlink(src, filename);
+ sources.close();
+ os.unlink(temp_filename);
+
+########################################
+
+def validate_packages(suite, component, architecture):
+ filename = "%s/dists/%s/%s/binary-%s/Packages.gz" \
+ % (Cnf["Dir::Root"], suite, component, architecture);
+ print "Processing %s..." % (filename);
+ # apt_pkg.ParseTagFile needs a real file handle and can't handle a GzipFile instance...
+ temp_filename = utils.temp_filename();
+ (result, output) = commands.getstatusoutput("gunzip -c %s > %s" % (filename, temp_filename));
+ if (result != 0):
+ sys.stderr.write("Gunzip invocation failed!\n%s\n" % (output));
+ sys.exit(result);
+ packages = utils.open_file(temp_filename);
+ Packages = apt_pkg.ParseTagFile(packages);
+ while Packages.Step():
+ filename = "%s/%s" % (Cnf["Dir::Root"], Packages.Section.Find('Filename'));
+ if not os.path.exists(filename):
+ print "W: %s missing." % (filename);
+ packages.close();
+ os.unlink(temp_filename);
+
+########################################
+
+def check_indices_files_exist():
+ for suite in [ "stable", "testing", "unstable" ]:
+ for component in Cnf.ValueList("Suite::%s::Components" % (suite)):
+ architectures = Cnf.ValueList("Suite::%s::Architectures" % (suite));
+ for arch in map(string.lower, architectures):
+ if arch == "source":
+ validate_sources(suite, component);
+ elif arch == "all":
+ continue;
+ else:
+ validate_packages(suite, component, arch);
+
+################################################################################
+
+def check_files_not_symlinks():
+ print "Building list of database files... ",;
+ before = time.time();
+ q = projectB.query("SELECT l.path, f.filename, f.id FROM files f, location l WHERE f.location = l.id")
+ print "done. (%d seconds)" % (int(time.time()-before));
+ q_files = q.getresult();
+
+# locations = {};
+# q = projectB.query("SELECT l.path, c.name, l.id FROM location l, component c WHERE l.component = c.id");
+# for i in q.getresult():
+# path = os.path.normpath(i[0] + i[1]);
+# locations[path] = (i[0], i[2]);
+
+# q = projectB.query("BEGIN WORK");
+ for i in q_files:
+ filename = os.path.normpath(i[0] + i[1]);
+# file_id = i[2];
+ if os.access(filename, os.R_OK) == 0:
+ utils.warn("%s: doesn't exist." % (filename));
+ else:
+ if os.path.islink(filename):
+ utils.warn("%s: is a symlink." % (filename));
+ # You probably don't want to use the rest of this...
+# print "%s: is a symlink." % (filename);
+# dest = os.readlink(filename);
+# if not os.path.isabs(dest):
+# dest = os.path.normpath(os.path.join(os.path.dirname(filename), dest));
+# print "--> %s" % (dest);
+# # Determine suitable location ID
+# # [in what must be the suckiest way possible?]
+# location_id = None;
+# for path in locations.keys():
+# if dest.find(path) == 0:
+# (location, location_id) = locations[path];
+# break;
+# if not location_id:
+# utils.fubar("Can't find location for %s (%s)." % (dest, filename));
+# new_filename = dest.replace(location, "");
+# q = projectB.query("UPDATE files SET filename = '%s', location = %s WHERE id = %s" % (new_filename, location_id, file_id));
+# q = projectB.query("COMMIT WORK");
+
+################################################################################
+
+def chk_bd_process_dir (unused, dirname, filenames):
+ for name in filenames:
+ if not name.endswith(".dsc"):
+ continue;
+ filename = os.path.abspath(dirname+'/'+name);
+ dsc = utils.parse_changes(filename);
+ for field_name in [ "build-depends", "build-depends-indep" ]:
+ field = dsc.get(field_name);
+ if field:
+ try:
+ apt_pkg.ParseSrcDepends(field);
+ except:
+ print "E: [%s] %s: %s" % (filename, field_name, field);
+ pass;
+
+################################################################################
+
+def check_build_depends():
+ os.path.walk(Cnf["Dir::Root"], chk_bd_process_dir, None);
+