#!/usr/bin/env python
# Handles NEW and BYHAND packages
-# Copyright (C) 2001, 2002, 2003, 2004, 2005 James Troup <james@nocrew.org>
-# $Id: lisa,v 1.31 2005-11-15 09:50:32 ajt Exp $
+# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 James Troup <james@nocrew.org>
# 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, time
import apt_pkg, apt_inst
-import db_access, fernanda, katie, logging, utils
+import examine_package
+import dak.lib.database as database
+import dak.lib.logging as logging
+import dak.lib.queue as queue
+import dak.lib.utils as utils
# Globals
-lisa_version = "$Revision: 1.31 $"
-
Cnf = None
Options = None
-Katie = None
+Upload = None
projectB = None
Logger = None
def recheck():
global reject_message
- files = Katie.pkg.files
+ files = Upload.pkg.files
reject_message = ""
for file in files.keys():
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, Katie.pkg.changes["distribution"].keys()):
+ if not Upload.pkg.changes["architecture"].has_key("source") \
+ and not Upload.source_exists(source_package, source_version, Upload.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):
# Version and file overwrite checks
if files[file]["type"] == "deb":
- reject(Katie.check_binary_against_db(file))
+ reject(Upload.check_binary_against_db(file))
elif files[file]["type"] == "dsc":
- reject(Katie.check_source_against_db(file))
- (reject_msg, is_in_incoming) = Katie.check_dsc_against_db(file)
+ reject(Upload.check_source_against_db(file))
+ (reject_msg, is_in_incoming) = Upload.check_dsc_against_db(file)
reject(reject_msg)
if reject_message:
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt)
- m = katie.re_default_answer.match(prompt)
+ m = queue.re_default_answer.match(prompt)
if answer == "":
answer = m.group(1)
answer = answer[:1].upper()
if answer == 'R':
- Katie.do_reject(0, reject_message)
- os.unlink(Katie.pkg.changes_file[:-8]+".katie")
+ Upload.do_reject(0, reject_message)
+ os.unlink(Upload.pkg.changes_file[:-8]+".dak")
return 0
elif answer == 'S':
return 0
new[pkg]["othercomponents"] = f["othercomponents"]
for suite in changes["suite"].keys():
- suite_id = db_access.get_suite_id(suite)
+ suite_id = database.get_suite_id(suite)
for pkg in new.keys():
- component_id = db_access.get_component_id(new[pkg]["component"])
- type_id = db_access.get_override_type_id(new[pkg]["type"])
+ component_id = database.get_component_id(new[pkg]["component"])
+ type_id = database.get_override_type_id(new[pkg]["type"])
q = projectB.query("SELECT package FROM override WHERE package = '%s' AND suite = %s AND component = %s AND type = %s" % (pkg, suite_id, component_id, type_id))
ql = q.getresult()
if ql:
# Read in all the .changes files
for filename in changes_files:
try:
- Katie.pkg.changes_file = filename
- Katie.init_vars()
- Katie.update_vars()
- cache[filename] = copy.copy(Katie.pkg.changes)
+ Upload.pkg.changes_file = filename
+ Upload.init_vars()
+ Upload.update_vars()
+ cache[filename] = copy.copy(Upload.pkg.changes)
cache[filename]["filename"] = filename
except:
sorted_list.append(filename)
mtime = os.stat(d["filename"])[stat.ST_MTIME]
if mtime < oldest:
oldest = mtime
- have_note += (d.has_key("lisa note"))
+ have_note += (d.has_key("process-new note"))
per_source[source]["oldest"] = oldest
if not have_note:
per_source[source]["note_state"] = 0; # none
section = new[pkg]["section"]
priority = new[pkg]["priority"]
type = new[pkg]["type"]
- new[pkg]["section id"] = db_access.get_section_id(section)
- new[pkg]["priority id"] = db_access.get_priority_id(new[pkg]["priority"])
+ new[pkg]["section id"] = database.get_section_id(section)
+ new[pkg]["priority id"] = database.get_priority_id(new[pkg]["priority"])
# Sanity checks
if (section == "debian-installer" and type != "udeb") or \
(section != "debian-installer" and type == "udeb"):
line = "%-20s %-20s %-20s" % (pkg, priority, section)
line = line.strip()+'\n'
file.write(line)
- note = Katie.pkg.changes.get("lisa note")
+ note = Upload.pkg.changes.get("process-new note")
if note:
print "*"*75
print note
utils.fubar("invalid type (%s) for new. Dazed, confused and sure as heck not continuing." % (type))
# Validate the override type
- type_id = db_access.get_override_type_id(type)
+ type_id = database.get_override_type_id(type)
if type_id == -1:
utils.fubar("invalid type (%s) for new. Say wha?" % (type))
if priority.endswith("[!]"):
priority = priority[:-3]
for file in new[pkg]["files"]:
- Katie.pkg.files[file]["section"] = section
- Katie.pkg.files[file]["priority"] = priority
+ Upload.pkg.files[file]["section"] = section
+ Upload.pkg.files[file]["priority"] = priority
new[pkg]["section"] = section
new[pkg]["priority"] = priority
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt)
- m = katie.re_default_answer.match(prompt)
+ m = queue.re_default_answer.match(prompt)
if answer == "":
answer = m.group(1)
answer = answer[:1].upper()
readline.set_completer(None)
for file in new[index]["files"]:
- Katie.pkg.files[file]["section"] = section
- Katie.pkg.files[file]["priority"] = priority
+ Upload.pkg.files[file]["section"] = section
+ Upload.pkg.files[file]["priority"] = priority
new[index]["priority"] = priority
new[index]["section"] = section
return new
answer = answer[:1].upper()
if answer == "E" or answer == "D":
got_answer = 1
- elif katie.re_isanum.match (answer):
+ elif queue.re_isanum.match (answer):
answer = int(answer)
if (answer < 1) or (answer > index):
print "%s is not a valid index (%s). Please retry." % (answer, index_range(index))
answer = "XXX"
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt)
- m = katie.re_default_answer.search(prompt)
+ m = queue.re_default_answer.search(prompt)
if answer == "":
answer = m.group(1)
answer = answer[:1].upper()
return
elif answer == 'Q':
sys.exit(0)
- Katie.pkg.changes["lisa note"] = note
- Katie.dump_vars(Cnf["Dir::Queue::New"])
+ Upload.pkg.changes["process-new note"] = note
+ Upload.dump_vars(Cnf["Dir::Queue::New"])
################################################################################
stdout_fd = sys.stdout
try:
sys.stdout = less_fd
- fernanda.display_changes(Katie.pkg.changes_file)
- files = Katie.pkg.files
+ examine_package.display_changes(Upload.pkg.changes_file)
+ files = Upload.pkg.files
for file in files.keys():
if files[file].has_key("new"):
type = files[file]["type"]
if type == "deb":
- fernanda.check_deb(file)
+ examine_package.check_deb(file)
elif type == "dsc":
- fernanda.check_dsc(file)
+ examine_package.check_dsc(file)
finally:
sys.stdout = stdout_fd
except IOError, e:
if errno.errorcode[e.errno] == 'EPIPE':
- utils.warn("[fernanda] Caught EPIPE; skipping.")
+ utils.warn("[examine_package] Caught EPIPE; skipping.")
pass
else:
raise
except KeyboardInterrupt:
- utils.warn("[fernanda] Caught C-c; skipping.")
+ utils.warn("[examine_package] Caught C-c; skipping.")
pass
################################################################################
## FIXME: horribly Debian specific
def do_bxa_notification():
- files = Katie.pkg.files
+ files = Upload.pkg.files
summary = ""
for file in files.keys():
if files[file]["type"] == "deb":
summary += "\n"
summary += "Package: %s\n" % (control.Find("Package"))
summary += "Description: %s\n" % (control.Find("Description"))
- Katie.Subst["__BINARY_DESCRIPTIONS__"] = summary
- bxa_mail = utils.TemplateSubst(Katie.Subst,Cnf["Dir::Templates"]+"/lisa.bxa_notification")
+ Upload.Subst["__BINARY_DESCRIPTIONS__"] = summary
+ bxa_mail = utils.TemplateSubst(Upload.Subst,Cnf["Dir::Templates"]+"/process-new.bxa_notification")
utils.send_mail(bxa_mail)
################################################################################
def add_overrides (new):
- changes = Katie.pkg.changes
- files = Katie.pkg.files
+ changes = Upload.pkg.changes
+ files = Upload.pkg.files
projectB.query("BEGIN WORK")
for suite in changes["suite"].keys():
- suite_id = db_access.get_suite_id(suite)
+ suite_id = database.get_suite_id(suite)
for pkg in new.keys():
- component_id = db_access.get_component_id(new[pkg]["component"])
- type_id = db_access.get_override_type_id(new[pkg]["type"])
+ component_id = database.get_component_id(new[pkg]["component"])
+ type_id = database.get_override_type_id(new[pkg]["type"])
priority_id = new[pkg]["priority id"]
section_id = new[pkg]["section id"]
projectB.query("INSERT INTO override (suite, component, type, package, priority, section, maintainer) VALUES (%s, %s, %s, '%s', %s, %s, '')" % (suite_id, component_id, type_id, pkg, priority_id, section_id))
answer = "XXX"
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt)
- m = katie.re_default_answer.search(prompt)
+ m = queue.re_default_answer.search(prompt)
if answer == "":
answer = m.group(1)
answer = answer[:1].upper()
user_email_address = utils.whoami() + " <%s>" % (
Cnf["Dinstall::MyAdminAddress"])
- Subst = Katie.Subst
+ Subst = Upload.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")
+ Subst,Cnf["Dir::Templates"]+"/process-new.prod")
# Send the prod mail if appropriate
if not Cnf["Dinstall::Options::No-Mail"]:
def do_new():
print "NEW\n"
- files = Katie.pkg.files
- changes = Katie.pkg.changes
+ files = Upload.pkg.files
+ changes = Upload.pkg.changes
# Make a copy of distribution we can happily trample on
changes["suite"] = copy.copy(changes["distribution"])
changes["suite"][override] = 1
# Validate suites
for suite in changes["suite"].keys():
- suite_id = db_access.get_suite_id(suite)
+ suite_id = database.get_suite_id(suite)
if suite_id == -1:
utils.fubar("%s has invalid suite '%s' (possibly overriden). say wha?" % (changes, suite))
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt)
- m = katie.re_default_answer.search(prompt)
+ m = queue.re_default_answer.search(prompt)
if answer == "":
answer = m.group(1)
answer = answer[:1].upper()
elif answer == 'E':
new = edit_overrides (new)
elif answer == 'M':
- aborted = Katie.do_reject(1, Options["Manual-Reject"])
+ aborted = Upload.do_reject(1, Options["Manual-Reject"])
if not aborted:
- os.unlink(Katie.pkg.changes_file[:-8]+".katie")
+ os.unlink(Upload.pkg.changes_file[:-8]+".dak")
done = 1
elif answer == 'N':
- edit_note(changes.get("lisa note", ""))
+ edit_note(changes.get("process-new note", ""))
elif answer == 'P':
prod_maintainer()
elif answer == 'R':
confirm = utils.our_raw_input("Really clear note (y/N)? ").lower()
if confirm == "y":
- del changes["lisa note"]
+ del changes["process-new note"]
elif answer == 'S':
done = 1
elif answer == 'Q':
################################################################################
def usage (exit_code=0):
- print """Usage: lisa [OPTION]... [CHANGES]...
+ print """Usage: dak process-new [OPTION]... [CHANGES]...
-a, --automatic automatic run
-h, --help show this help and exit.
-m, --manual-reject=MSG manual reject with `msg'
################################################################################
def init():
- global Cnf, Options, Logger, Katie, projectB, Sections, Priorities
+ global Cnf, Options, Logger, Upload, projectB, Sections, Priorities
Cnf = utils.get_conf()
- Arguments = [('a',"automatic","Lisa::Options::Automatic"),
- ('h',"help","Lisa::Options::Help"),
- ('m',"manual-reject","Lisa::Options::Manual-Reject", "HasArg"),
- ('n',"no-action","Lisa::Options::No-Action"),
- ('V',"version","Lisa::Options::Version")]
+ Arguments = [('a',"automatic","Process-New::Options::Automatic"),
+ ('h',"help","Process-New::Options::Help"),
+ ('m',"manual-reject","Process-New::Options::Manual-Reject", "HasArg"),
+ ('n',"no-action","Process-New::Options::No-Action")]
for i in ["automatic", "help", "manual-reject", "no-action", "version"]:
- if not Cnf.has_key("Lisa::Options::%s" % (i)):
- Cnf["Lisa::Options::%s" % (i)] = ""
+ if not Cnf.has_key("Process-New::Options::%s" % (i)):
+ Cnf["Process-New::Options::%s" % (i)] = ""
changes_files = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv)
- Options = Cnf.SubTree("Lisa::Options")
+ Options = Cnf.SubTree("Process-New::Options")
if Options["Help"]:
usage()
- if Options["Version"]:
- print "lisa %s" % (lisa_version)
- sys.exit(0)
-
- Katie = katie.Katie(Cnf)
+ Upload = queue.Upload(Cnf)
if not Options["No-Action"]:
- Logger = Katie.Logger = logging.Logger(Cnf, "lisa")
+ Logger = Upload.Logger = logging.Logger(Cnf, "process-new")
- projectB = Katie.projectB
+ projectB = Upload.projectB
Sections = Section_Completer()
Priorities = Priority_Completer()
def do_byhand():
done = 0
while not done:
- files = Katie.pkg.files
+ files = Upload.pkg.files
will_install = 1
byhand = []
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt)
- m = katie.re_default_answer.search(prompt)
+ m = queue.re_default_answer.search(prompt)
if answer == "":
answer = m.group(1)
answer = answer[:1].upper()
for file in byhand:
del files[file]
elif answer == 'M':
- Katie.do_reject(1, Options["Manual-Reject"])
- os.unlink(Katie.pkg.changes_file[:-8]+".katie")
+ Upload.do_reject(1, Options["Manual-Reject"])
+ os.unlink(Upload.pkg.changes_file[:-8]+".dak")
done = 1
elif answer == 'S':
done = 1
retry = 0
while retry < 10:
try:
- lock_fd = os.open(Cnf["Lisa::AcceptedLockFile"], os.O_RDONLY | os.O_CREAT | os.O_EXCL)
+ lock_fd = os.open(Cnf["Process-New::AcceptedLockFile"], os.O_RDONLY | os.O_CREAT | os.O_EXCL)
retry = 10
except OSError, e:
if errno.errorcode[e.errno] == 'EACCES' or errno.errorcode[e.errno] == 'EEXIST':
retry += 1
if (retry >= 10):
- utils.fubar("Couldn't obtain lock; assuming jennifer is already running.")
+ utils.fubar("Couldn't obtain lock; assuming 'dak process-unchecked' is already running.")
else:
print("Unable to get accepted lock (try %d of 10)" % retry)
time.sleep(60)
else:
raise
- (summary, short_summary) = Katie.build_summaries()
- Katie.accept(summary, short_summary)
- os.unlink(Katie.pkg.changes_file[:-8]+".katie")
- os.unlink(Cnf["Lisa::AcceptedLockFile"])
+ (summary, short_summary) = Upload.build_summaries()
+ Upload.accept(summary, short_summary)
+ os.unlink(Upload.pkg.changes_file[:-8]+".dak")
+ os.unlink(Cnf["Process-New::AcceptedLockFile"])
def check_status(files):
new = byhand = 0
return (new, byhand)
def do_pkg(changes_file):
- Katie.pkg.changes_file = changes_file
- Katie.init_vars()
- Katie.update_vars()
- Katie.update_subst()
- files = Katie.pkg.files
+ Upload.pkg.changes_file = changes_file
+ Upload.init_vars()
+ Upload.update_vars()
+ Upload.update_subst()
+ files = Upload.pkg.files
if not recheck():
return
################################################################################
def end():
- accept_count = Katie.accept_count
- accept_bytes = Katie.accept_bytes
+ accept_count = Upload.accept_count
+ accept_bytes = Upload.accept_bytes
if accept_count:
sets = "set"
# Kill me now? **FIXME**
Cnf["Dinstall::Options::No-Mail"] = ""
- bcc = "X-Katie: lisa %s" % (lisa_version)
+ bcc = "X-DAK: dak process-new\nX-Katie: this header is obsolete"
if Cnf.has_key("Dinstall::Bcc"):
- Katie.Subst["__BCC__"] = bcc + "\nBcc: %s" % (Cnf["Dinstall::Bcc"])
+ Upload.Subst["__BCC__"] = bcc + "\nBcc: %s" % (Cnf["Dinstall::Bcc"])
else:
- Katie.Subst["__BCC__"] = bcc
+ Upload.Subst["__BCC__"] = bcc
for changes_file in changes_files:
changes_file = utils.validate_changes_file_arg(changes_file, 0)