#!/usr/bin/env python
# Handles NEW and BYHAND packages
-# Copyright (C) 2001, 2002, 2003 James Troup <james@nocrew.org>
-# $Id: lisa,v 1.23 2003-03-14 19:06:02 troup Exp $
+# Copyright (C) 2001, 2002, 2003, 2004 James Troup <james@nocrew.org>
+# $Id: lisa,v 1.30 2004-04-01 17:13:11 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
################################################################################
-import copy, errno, os, readline, stat, sys, tempfile;
+import copy, errno, os, readline, stat, sys;
import apt_pkg, apt_inst;
import db_access, fernanda, katie, logging, utils;
# Globals
-lisa_version = "$Revision: 1.23 $";
+lisa_version = "$Revision: 1.30 $";
Cnf = None;
Options = None;
reject_message = "";
for file in files.keys():
+ # The .orig.tar.gz can disappear out from under us is it's a
+ # duplicate of one in the archive.
+ if not files.has_key(file):
+ continue;
# Check that the source still exists
if files[file]["type"] == "deb":
source_version = files[file]["source version"];
source_package = files[file]["source package"];
if not Katie.pkg.changes["architecture"].has_key("source") \
- and not Katie.source_exists(source_package, source_version):
+ and not Katie.source_exists(source_package, source_version, Katie.pkg.changes["distribution"].keys()):
source_epochless_version = utils.re_no_epoch.sub('', source_version);
dsc_filename = "%s_%s.dsc" % (source_package, source_epochless_version);
if not os.path.exists(Cnf["Dir::Queue::Accepted"] + '/' + dsc_filename):
def edit_new (new):
# Write the current data to a temporary file
- temp_filename = tempfile.mktemp();
- fd = os.open(temp_filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700);
- os.close(fd);
+ temp_filename = utils.temp_filename();
temp_file = utils.open_file(temp_filename, 'w');
print_new (new, 0, temp_file);
temp_file.close();
got_priority = 0;
while not got_priority:
new_priority = utils.our_raw_input("New priority: ").strip();
- if Priorities.priorities.count(new_priority) == 0:
+ if new_priority not in Priorities.priorities:
print "E: '%s' is not a valid priority, try again." % (new_priority);
else:
got_priority = 1;
got_section = 0;
while not got_section:
new_section = utils.our_raw_input("New section: ").strip();
- if Sections.sections.count(new_section) == 0:
+ if new_section not in Sections.sections:
print "E: '%s' is not a valid section, try again." % (new_section);
else:
got_section = 1;
def edit_note(note):
# Write the current data to a temporary file
- temp_filename = tempfile.mktemp();
- fd = os.open(temp_filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700);
- os.close(fd);
+ temp_filename = utils.temp_filename();
temp_file = utils.open_file(temp_filename, 'w');
temp_file.write(note);
temp_file.close();
################################################################################
+def prod_maintainer ():
+ # Here we prepare an editor and get them ready to prod...
+ temp_filename = utils.temp_filename();
+ editor = os.environ.get("EDITOR","vi")
+ answer = 'E';
+ while answer == 'E':
+ os.system("%s %s" % (editor, temp_filename))
+ file = utils.open_file(temp_filename);
+ prod_message = "".join(file.readlines());
+ file.close();
+ print "Prod message:";
+ print utils.prefix_multi_line_string(prod_message," ",include_blank_lines=1);
+ prompt = "[P]rod, Edit, Abandon, Quit ?"
+ answer = "XXX";
+ while prompt.find(answer) == -1:
+ answer = utils.our_raw_input(prompt);
+ m = katie.re_default_answer.search(prompt);
+ if answer == "":
+ answer = m.group(1);
+ answer = answer[:1].upper();
+ os.unlink(temp_filename);
+ if answer == 'A':
+ return;
+ elif answer == 'Q':
+ sys.exit(0);
+ # Otherwise, do the proding...
+ user_email_address = utils.whoami() + " <%s>" % (
+ Cnf["Dinstall::MyAdminAddress"]);
+
+ Subst = Katie.Subst;
+
+ Subst["__FROM_ADDRESS__"] = user_email_address;
+ Subst["__PROD_MESSAGE__"] = prod_message;
+ Subst["__CC__"] = "Cc: " + Cnf["Dinstall::MyEmailAddress"];
+
+ prod_mail_message = utils.TemplateSubst(
+ Subst,Cnf["Dir::Templates"]+"/lisa.prod");
+
+ # Send the prod mail if appropriate
+ if not Cnf["Dinstall::Options::No-Mail"]:
+ utils.send_mail(prod_mail_message);
+
+ print "Sent proding message";
+
+################################################################################
+
def do_new():
print "NEW\n";
files = Katie.pkg.files;
print "W: note must be removed before package can be processed.";
prompt += "Remove note, ";
- prompt += "Edit overrides, Check, Manual reject, Note edit, [S]kip, Quit ?";
+ prompt += "Edit overrides, Check, Manual reject, Note edit, Prod, [S]kip, Quit ?";
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt);
done = 1;
elif answer == 'N':
edit_note(changes.get("lisa note", ""));
+ elif answer == 'P':
+ prod_maintainer();
elif answer == 'R':
confirm = utils.our_raw_input("Really clear note (y/N)? ").lower();
if confirm == "y":