]> git.decadent.org.uk Git - dak.git/commitdiff
* alicia: Added * docs/alicia.1.sgml: Added * docs/Makefile: Added alicia to the...
authorDaniel Silverstone <dsilvers@debian.org>
Thu, 29 Jan 2004 01:00:08 +0000 (01:00 +0000)
committerDaniel Silverstone <dsilvers@debian.org>
Thu, 29 Jan 2004 01:00:08 +0000 (01:00 +0000)
alicia [new file with mode: 0755]
docs/Makefile
docs/README.first
docs/alicia.1.sgml [new file with mode: 0644]

diff --git a/alicia b/alicia
new file mode 100755 (executable)
index 0000000..50e5745
--- /dev/null
+++ b/alicia
@@ -0,0 +1,206 @@
+#!/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()
index c5c7f0e3ad54a4d6e9e898832cf3e9339876cc8f..feaa9442f4459a582aa739c17067c5720bdef965 100644 (file)
@@ -2,7 +2,7 @@
 
 # TODO: alyson andrea claire fernanda jenna neve rene shania tea ziyi
 
-SGMLMANPAGES   = catherine.1.sgml charisma.1.sgml cindy.1.sgml heidi.1.sgml julia.1.sgml kelly.1.sgml lisa.1.sgml madison.1.sgml melanie.1.sgml natalie.1.sgml rhona.1.sgml
+SGMLMANPAGES   = catherine.1.sgml charisma.1.sgml cindy.1.sgml heidi.1.sgml julia.1.sgml kelly.1.sgml lisa.1.sgml madison.1.sgml melanie.1.sgml natalie.1.sgml rhona.1.sgml alicia.1.sgml
 
 MANPAGES       = $(patsubst %.sgml, %, $(SGMLMANPAGES))
 
index d77a526c2ff827da2339a8581f58c9270bbd71eb..5a526ac8a81f207916492cbe6d4f5adc31968620 100644 (file)
@@ -37,11 +37,13 @@ o To clean things up:
   * rhona - to remove obsolete files from the pool
   * shania - to remove obsolete/stray files from the queue
   * melanie - to remove package(s) from suite(s)
+  * alicia - to change individual override entries
 
 o Information display:
 
   * madison - shows information about package(s)
   * helena - shows information about package(s) in queue/
+  * alicia - can show you individual override entries
 
 Generic and useful, but only for those with existing archives
 -------------------------------------------------------------
diff --git a/docs/alicia.1.sgml b/docs/alicia.1.sgml
new file mode 100644 (file)
index 0000000..9211190
--- /dev/null
@@ -0,0 +1,82 @@
+<!-- -*- 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>