--- /dev/null
+#!/usr/bin/env python
+
+# Microscopic modification and query tool for overrides in projectb
+# Copyright (C) 2004 Daniel Silverstone <dsilvers@digital-scurf.org>
+# $Id: alicia,v 1.1 2004-01-29 01:00:08 dsilvers 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
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+################################################################################
+## So line up your soldiers and she'll shoot them all down
+## Coz Alisha Rules The World
+## You think you found a dream, then it shatters and it seems,
+## That Alisha Rules The World
+################################################################################
+
+import pg, pwd, sys;
+import utils, db_access;
+import apt_pkg, logging;
+
+################################################################################
+
+Cnf = None;
+projectB = None;
+
+################################################################################
+
+# Shamelessly stolen from melanie. Should probably end up in utils.py
+def game_over():
+ answer = utils.our_raw_input("Continue (y/N)? ").lower();
+ if answer != "y":
+ print "Aborted."
+ sys.exit(1);
+
+
+def usage (exit_code=0):
+ print """Usage: alicia [OPTIONS] package [section priority]
+Make a microscopic override change/query
+
+ -h, --help show this help and exit
+ -n, --no-action don't do anything
+ -s, --suite specify the suite to use
+"""
+ sys.exit(exit_code)
+
+def main ():
+ global Cnf, projectB;
+
+ Cnf = utils.get_conf()
+
+ Arguments = [('h',"help","Alicia::Options::Help"),
+ ('n',"no-action","Alicia::Options::No-Action"),
+ ('s',"suite","Alicia::Options::Suite", "HasArg"),
+ ];
+ for i in ["help", "no-action"]:
+ if not Cnf.has_key("Alicia::Options::%s" % (i)):
+ Cnf["Alicia::Options::%s" % (i)] = "";
+ if not Cnf.has_key("Alicia::Options::Suite"):
+ Cnf["Alicia::Options::Suite"] = "unstable";
+
+ arguments = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+ Options = Cnf.SubTree("Alicia::Options")
+
+ if Options["Help"]:
+ usage();
+
+ projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"]));
+ db_access.init(Cnf, projectB);
+
+ if not arguments:
+ utils.fubar("package name is a required argument.");
+
+ package = arguments.pop(0);
+
+ if arguments and len(arguments) > 2:
+ utils.fubar("Too many arguments");
+
+ if arguments and len(arguments) == 1:
+ # Determine if the argument is a priority or a section...
+ arg = arguments.pop();
+ q = projectB.query("""
+ SELECT ( SELECT COUNT(*) FROM section WHERE section=%s ) AS secs,
+ ( SELECT COUNT(*) FROM priority WHERE priority=%s ) AS prios
+ """ % ( pg._quote(arg,"str"), pg._quote(arg,"str")));
+ r = q.getresult();
+ if r[0][0] == 1:
+ arguments = (arg,".");
+ elif r[0][1] == 1:
+ arguments = (".",arg);
+ else:
+ utils.fubar("%s is not a valid section or priority");
+
+
+ # Retrieve current section/priority...
+ q = projectB.query("""
+ SELECT priority.priority AS prio, section.section AS sect
+ FROM override, priority, section, suite
+ WHERE override.priority = priority.id
+ AND override.section = section.id
+ AND override.package = %s
+ AND override.suite = suite.id
+ AND suite.suite_name = %s
+ """ % (pg._quote(package,"str"), pg._quote(Options["Suite"],"str")));
+
+ if q.ntuples() == 0:
+ utils.fubar("Unable to find package %s" % (package));
+ if q.ntuples() > 1:
+ utils.fubar("%s is ambiguous. Matches %d packages" % (package,q.ntuples()));
+
+ r = q.getresult();
+ oldsection = r[0][1];
+ oldpriority = r[0][0];
+
+ if not arguments:
+ print "%s is in section '%s' at priority '%s'" % (
+ package,oldsection,oldpriority);
+ sys.exit(0);
+
+ # At this point, we have a new section and priority... check they're valid...
+ newsection, newpriority = arguments;
+
+ if newsection == ".":
+ newsection = oldsection;
+ if newpriority == ".":
+ newpriority = oldpriority;
+
+ q = projectB.query("SELECT id FROM section WHERE section=%s" % (
+ pg._quote(newsection,"str")));
+
+ if q.ntuples() == 0:
+ utils.fubar("Supplied section %s is invalid" % (newsection));
+ newsecid = q.getresult()[0][0];
+
+ q = projectB.query("SELECT id FROM priority WHERE priority=%s" % (
+ pg._quote(newpriority,"str")));
+
+ if q.ntuples() == 0:
+ utils.fubar("Supplied priority %s is invalid" % (newpriority));
+ newprioid = q.getresult()[0][0];
+
+ if newpriority == oldpriority and newsection == oldsection:
+ print "I: Doing nothing"
+ sys.exit(0);
+
+ # If we're in no-action mode
+ if Options["No-Action"]:
+ if newpriority != oldpriority:
+ print "I: Would change priority from %s to %s" % (oldpriority,newpriority);
+ if newsection != oldsection:
+ print "I: Would change section from %s to %s" % (oldsection,newsection);
+ sys.exit(0);
+
+ if newpriority != oldpriority:
+ print "I: Will change priority from %s to %s" % (oldpriority,newpriority);
+ if newsection != oldsection:
+ print "I: Will change section from %s to %s" % (oldsection,newsection);
+
+ game_over();
+
+ Logger = logging.Logger(Cnf, "alicia");
+
+ projectB.query("BEGIN WORK");
+ # We're in "do it" mode, we have something to do... do it
+ if newpriority != oldpriority:
+ q = projectB.query("""
+ UPDATE override
+ SET priority=%d
+ WHERE package=%s
+ AND suite = (SELECT id FROM suite WHERE suite_name=%s)""" % (
+ newprioid,
+ pg._quote(package,"str"),
+ pg._quote(Options["Suite"],"str") ));
+ Logger.log(["changed priority",package,oldpriority,newpriority]);
+
+ if newsection != oldsection:
+ q = projectB.query("""
+ UPDATE override
+ SET section=%d
+ WHERE package=%s
+ AND suite = (SELECT id FROM suite WHERE suite_name=%s)""" % (
+ newsecid,
+ pg._quote(package,"str"),
+ pg._quote(Options["Suite"],"str") ));
+ Logger.log(["changed priority",package,oldsection,newsection]);
+ projectB.query("COMMIT WORK");
+
+ Logger.close();
+
+ print "Done";
+
+#################################################################################
+
+if __name__ == '__main__':
+ main()
--- /dev/null
+<!-- -*- mode: sgml -*- -->
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
+
+<!ENTITY % katieent SYSTEM "katie.ent">
+%katieent;
+
+]>
+
+<refentry>
+ &katie-docinfo;
+
+ <refmeta>
+ <refentrytitle>alicia</>
+ <manvolnum>1</>
+ </refmeta>
+
+ <!-- Man page title -->
+ <refnamediv>
+ <refname>alicia</>
+ <refpurpose>Make micromodifications or queries to the overrides table</>
+ </refnamediv>
+
+ <!-- Arguments -->
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>alicia</>
+ <arg><option><replaceable>options</replaceable></></arg>
+ <arg choice="plain"><replaceable>package</replaceable></arg>
+ <arg><option><replaceable>section</replaceable></></arg>
+ <arg><option><replaceable>priority</replaceable></></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <RefSect1><Title>Description</>
+ <para>
+ <command>alicia</command> makes micromodifications and queries the overrides.
+ </PARA>
+ </REFSECT1>
+
+ <RefSect1><Title>Options</>
+
+ <VariableList>
+ <VarListEntry><term><option>-h/--help</option></>
+ <ListItem>
+ <Para>Show help and then exit.</PARA>
+ </LISTITEM>
+ </VarListEntry>
+ <VarListEntry><term><option>-n/--no-action</option></>
+ <ListItem>
+ <Para>Show what alicia would do but make no changes</PARA>
+ </LISTITEM>
+ </VarListEntry>
+ <VarListEntry><term><option>-s/--suite=<replaceable>suite</replaceable></option></>
+ <ListItem>
+ <Para>Affect the overrides in suite listed. The default is <literal>unstable</literal></PARA>
+ </LISTITEM>
+ </VarListEntry>
+
+ </VariableList>
+ </RefSect1>
+
+ <RefSect1><Title>Common use</>
+ <para>
+ <command>alicia</command> when invoked with only a package name will tell you what section and priority the given package has.
+ </PARA>
+ <para>
+ <command>alicia</command> when invoked with a package and one or two other values will set the section and/or priority to the values given. You may use a single period ('.') to represent "do not change" or you can ommit the value you do not want to change.
+ </PARA>
+ </RefSect1>
+ <RefSect1><Title>Notes</>
+
+ <Para>alicia essentially lets you do what natalie does only on the microscopic scale rather than the macroscopic scale of natalie. Use with care.</>
+
+ <RefSect1><Title>Diagnostics</>
+ <para>
+ <command>alicia</command> returns zero on normal operation, non-zero on error.
+ </PARA>
+ </RefSect1>
+
+ &manauthor;
+
+</refentry>