# Installs Debian packaes
# Copyright (C) 2000, 2001 James Troup <james@nocrew.org>
-# $Id: katie,v 1.33 2001-03-21 01:05:07 troup Exp $
+# $Id: katie,v 1.41 2001-05-17 01:21:40 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
install_bytes = 0.0;
reprocess = 0;
orig_tar_id = None;
+orig_tar_location = "";
legacy_source_untouchable = {};
Subst = {};
global reject_message, changes, files
# Default in case we bail out
- changes["maintainer822"] = Cnf["Dinstall::MyEmailAddress"];
-
+ 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)
# 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",""));
- # For source uploads the Changed-By field wins; otherwise Maintainer wins.
- if changes["architecture"].has_key("source"):
- changes["uploader822"] = "To: %s\nCc: %s" % (changes["changedby822"], changes["maintainer822"]);
- # changes["uploadername"], changes["uploaderemail"]) = (changes["changedby822"], changes["changedbyname"], changes["changedbyemail"]);
-
# Ensure all the values in Closes: are numbers
if changes.has_key("closes"):
for i in changes["closes"].keys():
# FIXME: should probably remove anything that != stable
for i in ("frozen", "unstable"):
if changes["distribution"].has_key(i):
- reject_message = reject_message + "Removing %s from distribution list.\n"
+ reject_message = reject_message + "Removing %s from distribution list.\n" % (i)
del changes["distribution"][i]
changes["stable upload"] = 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
###############################################################################
def check_dsc ():
- global dsc, dsc_files, reject_message, reprocess, orig_tar_id, legacy_source_untouchable;
+ 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":
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 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));
+ 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 != []:
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_id = x[3];
+ orig_tar_location = "legacy";
+ else:
+ orig_tar_location = x[4];
else:
# Not there? Check in Incoming...
# [See comment above process_it() for explanation
# problem just changed the symptoms.
def check_diff ():
- global dsc, dsc_files, reject_message, reprocess, orig_tar_id;
+ global dsc, dsc_files, reject_message, reprocess;
for filename in files.keys():
if files[filename]["type"] == "diff.gz":
def update_subst (changes_filename):
global Subst;
-
- Subst["__ARCHITECTURE__"] = string.join(changes["architecture"].keys(), ' ' );
+
+ if changes.has_key("architecture"):
+ Subst["__ARCHITECTURE__"] = string.join(changes["architecture"].keys(), ' ' );
+ else:
+ Subst["__ARCHITECTURE__"] = "Unknown";
Subst["__CHANGES_FILENAME__"] = os.path.basename(changes_filename);
- Subst["__FILE_CONTENTS__"] = changes["filecontents"];
- Subst["__MAINTAINER_ADDRESS__"] = changes["maintainer822"];
- Subst["__MAINTAINER__"] = changes["maintainer"];
+ Subst["__FILE_CONTENTS__"] = changes.get("filecontents", "");
+
+ # For source uploads the Changed-By field wins; otherwise Maintainer wins.
+ if changes["architecture"].has_key("source") and changes["changedby822"] != "" and (changes["changedby822"] != changes["maintainer822"]):
+ Subst["__MAINTAINER_FROM__"] = changes["changedby822"];
+ Subst["__MAINTAINER_TO__"] = changes["changedby822"] + ", " + changes["maintainer822"];
+ Subst["__MAINTAINER__"] = changes.get("changed-by", "Unknown");
+ else:
+ Subst["__MAINTAINER_FROM__"] = changes["maintainer822"];
+ Subst["__MAINTAINER_TO__"] = changes["maintainer822"];
+ Subst["__MAINTAINER__"] = changes.get("maintainer", "Unknown");
+
Subst["__REJECT_MESSAGE__"] = reject_message;
- Subst["__SOURCE__"] = changes["source"];
- Subst["__VERSION__"] = changes["version"];
+ Subst["__SOURCE__"] = changes.get("source", "Unknown");
+ Subst["__VERSION__"] = changes.get("version", "Unknown");
#####################################################################################################################
answer = 'S'
if string.find(reject_message, "Rejected") != -1:
- if time.time()-os.path.getmtime(changes_filename) < 86400:
+ try:
+ modified_time = time.time()-os.path.getmtime(changes_filename);
+ except: # i.e. ignore errors like 'file does not exist';
+ modified_time = 0;
+ if modified_time < 86400:
print "SKIP (too new)\n" + reject_message,;
prompt = "[S]kip, Manual reject, Quit ?";
else:
architecture = files[file]["architecture"]
architecture_id = db_access.get_architecture_id (architecture);
type = files[file]["dbtype"];
- component = files[file]["component"]
+ dsc_component = files[file]["component"]
source = files[file]["source"]
source_version = ""
if string.find(source, "(") != -1:
# If the .orig.tar.gz is in a legacy directory we need to poolify
# it, so that apt-get source (and anything else that goes by the
# "Directory:" field in the Sources.gz file) works.
- if orig_tar_id != None:
+ if orig_tar_id != None and orig_tar_location == "legacy":
q = projectB.query("SELECT DISTINCT ON (f.id) l.path, f.filename, f.id as files_id, df.source, df.id as dsc_files_id, f.size, f.md5sum FROM files f, dsc_files df, location l WHERE df.source IN (SELECT source FROM dsc_files WHERE file = %s) AND f.id = df.file AND l.id = f.location AND (l.type = 'legacy' OR l.type = 'legacy-mixed')" % (orig_tar_id));
qd = q.dictresult();
for qid in qd:
# Then Update the DB's files table
q = projectB.query("UPDATE files SET filename = '%s', location = '%s' WHERE id = '%s'" % (pool_filename, dsc_location_id, qid["files_id"]));
+ # If this is a sourceful diff only upload that is moving non-legacy
+ # cross-component we need to copy the .orig.tar.gz into the new
+ # component too for the same reasons as above.
+ #
+ if changes["architecture"].has_key("source") and orig_tar_id != None and \
+ orig_tar_location != "legacy" and orig_tar_location != dsc_location_id:
+ q = projectB.query("SELECT l.path, f.filename, f.size, f.md5sum FROM files f, location l WHERE f.id = %s AND f.location = l.id" % (orig_tar_id));
+ ql = q.getresult()[0];
+ old_filename = ql[0] + ql[1];
+ file_size = ql[2];
+ file_md5sum = ql[3];
+ new_filename = utils.poolify (changes["source"], dsc_component) + os.path.basename(old_filename);
+ new_files_id = db_access.get_files_id(new_filename, file_size, file_md5sum, dsc_location_id);
+ if new_files_id == None:
+ utils.copy(old_filename, Cnf["Dir::PoolDir"] + new_filename);
+ new_files_id = db_access.set_files_id(new_filename, file_size, file_md5sum, dsc_location_id);
+ projectB.query("UPDATE dsc_files SET file = %s WHERE source = %s AND file = %s" % (new_files_id, source_id, orig_tar_id));
+
# Install the files into the pool
for file in files.keys():
if files[file].has_key("byhand"):
projectB.query("COMMIT WORK");
- utils.move (changes_filename, Cnf["Rhona::Morgue"] + os.path.basename(changes_filename));
+ # FIXME
+ utils.move (changes_filename, Cnf["Dir::Morgue"] + '/katie/' + os.path.basename(changes_filename));
# Update the Stable ChangeLog file
install_count = install_count + 1;
if not Cnf["Dinstall::Options::No-Mail"]:
- Subst["__SUITE__"] = "into stable";
+ Subst["__SUITE__"] = " into stable";
Subst["__SUMMARY__"] = summary;
+ mail_message = utils.TemplateSubst(Subst,open(Cnf["Dir::TemplatesDir"]+"/katie.installed","r").read());
utils.send_mail (mail_message, "")
announce (short_summary, 1)
os.write(fd, reject_message);
os.close(fd);
Subst["__MANUAL_REJECT_MESSAGE__"] = "";
+ Subst["__CC__"] = "X-Katie-Rejection: automatic (moo)";
reject_mail_message = utils.TemplateSubst(Subst,open(Cnf["Dir::TemplatesDir"]+"/katie.rejected","r").read());
else: # Have a manual rejection file to use
reject_mail_message = ""; # avoid <undef>'s
global Subst;
# Build up the rejection email
- user_email_address = string.replace(string.split(pwd.getpwuid(os.getuid())[4],',')[0], '.', '')
- user_email_address = user_email_address + " <%s@%s>" % (pwd.getpwuid(os.getuid())[0], Cnf["Dinstall::MyHost"])
+ user_email_address = utils.whoami() + " <%s@%s>" % (pwd.getpwuid(os.getuid())[0], Cnf["Dinstall::MyHost"])
manual_reject_message = Cnf.get("Dinstall::Options::Manual-Reject", "")
Subst["__MANUAL_REJECT_MESSAGE__"] = manual_reject_message;
+ Subst["__CC__"] = "Cc: " + Cnf["Dinstall::MyEmailAddress"];
reject_mail_message = utils.TemplateSubst(Subst,open(Cnf["Dir::TemplatesDir"]+"/katie.rejected","r").read());
# Write the rejection email out as the <foo>.reason file
# If we weren't given one, spawn an editor so the user can add one in
if manual_reject_message == "":
- result = os.system("vi +6 %s" % (reject_file))
+ result = os.system("vi +6 %s" % (reject_filename))
if result != 0:
- sys.stderr.write ("vi invocation failed for `%s'!\n" % (reject_file))
+ sys.stderr.write ("vi invocation failed for `%s'!\n" % (reject_filename))
sys.exit(result)
# Then process it as if it were an automatic rejection
# into the .changes structure and reprocess the .changes file.
def process_it (changes_file):
- global reprocess, orig_tar_id, changes, dsc, dsc_files, files, reject_message;
+ global reprocess, orig_tar_id, orig_tar_location, changes, dsc, dsc_files, files, reject_message;
# Reset some globals
reprocess = 1;
dsc_files = {};
files = {};
orig_tar_id = None;
+ orig_tar_location = "";
legacy_source_untouchable = {};
reject_message = "";
- orig_tar_id = None;
# Absolutize the filename to avoid the requirement of being in the
# same directory as the .changes file.
Subst = {}
Subst["__ADMIN_ADDRESS__"] = Cnf["Dinstall::MyAdminAddress"];
Subst["__BUG_SERVER__"] = Cnf["Dinstall::BugServer"];
- bcc = "X-Katie: $Id: katie,v 1.33 2001-03-21 01:05:07 troup Exp $"
+ bcc = "X-Katie: $Revision: 1.41 $"
if Cnf.has_key("Dinstall::Bcc"):
Subst["__BCC__"] = bcc + "\nBcc: %s" % (Cnf["Dinstall::Bcc"]);
else: