]> git.decadent.org.uk Git - dak.git/blobdiff - dak/ls.py
auto-decruft: Disable short options for NVI
[dak.git] / dak / ls.py
index 4eb8e8c8da9b4625442a635cdb6ab68310df5649..5ac4c660ee508d379bddf3db5bab72db31e3e7eb 100755 (executable)
--- a/dak/ls.py
+++ b/dak/ls.py
@@ -36,7 +36,7 @@ import sys
 import apt_pkg
 
 from daklib.config import Config
-from daklib.dbconn import *
+from daklib.ls import list_packages
 from daklib import utils
 
 ################################################################################
@@ -54,9 +54,10 @@ Display information about PACKAGE(s).
   -r, --regex                treat PACKAGE as a regex
   -s, --suite=SUITE          only show info for this suite
   -S, --source-and-binary    show info for the binary children of source pkgs
+  -f, --format=control-suite use same format as control-suite for output
 
 ARCH, COMPONENT and SUITE can be comma (or space) separated lists, e.g.
-    --architecture=m68k,i386"""
+    --architecture=amd64,i386"""
     sys.exit(exit_code)
 
 ################################################################################
@@ -80,18 +81,16 @@ def main ():
         if not cnf.has_key("Ls::Options::%s" % (i)):
             cnf["Ls::Options::%s" % (i)] = ""
 
-    packages = apt_pkg.ParseCommandLine(cnf.Cnf, Arguments, sys.argv)
-    Options = cnf.SubTree("Ls::Options")
+    packages = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv)
+    Options = cnf.subtree("Ls::Options")
 
     if Options["Help"]:
         usage()
     if not packages:
         utils.fubar("need at least one package name as an argument.")
 
-    session = DBConn().session()
-
     # If cron.daily is running; warn the user that our output might seem strange
-    if os.path.exists(os.path.join(cnf["Dir::Root"], "Archive_Maintenance_In_Progress")):
+    if os.path.exists(os.path.join(cnf["Dir::Lock"], "daily.lock")):
         utils.warn("Archive maintenance is in progress; database inconsistencies are possible.")
 
     # Handle buildd maintenance helper options
@@ -101,101 +100,32 @@ def main ():
         if not Options["Suite"]:
             Options["Suite"] = "unstable"
 
-    # Parse -a/--architecture, -c/--component and -s/--suite
-    (con_suites, con_architectures, con_components, check_source) = \
-                 utils.parse_args(Options)
-
-    if Options["BinaryType"]:
-        if Options["BinaryType"] != "udeb" and Options["BinaryType"] != "deb":
-            utils.fubar("Invalid binary type.  'udeb' and 'deb' recognised.")
-        con_bintype = "AND b.type = '%s'" % (Options["BinaryType"])
-        # REMOVE ME TRAMP
-        if Options["BinaryType"] == "udeb":
-            check_source = 0
-    else:
-        con_bintype = ""
+    kwargs = dict()
 
     if Options["Regex"]:
-        comparison_operator = "~"
-    else:
-        comparison_operator = "="
-
+        kwargs['regex'] = True
     if Options["Source-And-Binary"]:
-        new_packages = []
-        for package in packages:
-            q = session.execute("SELECT DISTINCT b.package FROM binaries b, bin_associations ba, suite su, source s WHERE b.source = s.id AND su.id = ba.suite AND b.id = ba.bin AND s.source %s :package %s" % (comparison_operator, con_suites),
-                                {'package': package})
-            new_packages.extend([ i[0] for i in q.fetchall() ])
-            if package not in new_packages:
-                new_packages.append(package)
-        packages = new_packages
-
-    results = 0
-    for package in packages:
-        q = session.execute("""
-SELECT b.package, b.version, a.arch_string, su.suite_name, c.name, m.name
-  FROM binaries b, architecture a, suite su, bin_associations ba,
-       files f, location l, component c, maintainer m
- WHERE b.package %s :package AND a.id = b.architecture AND su.id = ba.suite
-   AND b.id = ba.bin AND b.file = f.id AND f.location = l.id
-   AND l.component = c.id AND b.maintainer = m.id %s %s %s
-""" % (comparison_operator, con_suites, con_architectures, con_bintype), {'package': package})
-        ql = q.fetchall()
-        if check_source:
-            q = session.execute("""
-SELECT s.source, s.version, 'source', su.suite_name, c.name, m.name
-  FROM source s, suite su, src_associations sa, files f, location l,
-       component c, maintainer m
- WHERE s.source %s :package AND su.id = sa.suite AND s.id = sa.source
-   AND s.file = f.id AND f.location = l.id AND l.component = c.id
-   AND s.maintainer = m.id %s
-""" % (comparison_operator, con_suites), {'package': package})
-            ql.extend(q.fetchall())
-        d = {}
-        highver = {}
-        for i in ql:
-            results += 1
-            (pkg, version, architecture, suite, component, maintainer) = i
-            if component != "main":
-                suite = "%s/%s" % (suite, component)
-            if not d.has_key(pkg):
-                d[pkg] = {}
-            highver.setdefault(pkg,"")
-            if not d[pkg].has_key(version):
-                d[pkg][version] = {}
-                if apt_pkg.VersionCompare(version, highver[pkg]) > 0:
-                    highver[pkg] = version
-            if not d[pkg][version].has_key(suite):
-                d[pkg][version][suite] = []
-            d[pkg][version][suite].append(architecture)
-
-        packages = d.keys()
-        packages.sort()
-        for pkg in packages:
-            versions = d[pkg].keys()
-            versions.sort(apt_pkg.VersionCompare)
-            for version in versions:
-                suites = d[pkg][version].keys()
-                suites.sort()
-                for suite in suites:
-                    arches = d[pkg][version][suite]
-                    arches.sort(utils.arch_compare_sw)
-                    if Options["Format"] == "": #normal
-                        sys.stdout.write("%10s | %10s | %13s | " % (pkg, version, suite))
-                        sys.stdout.write(", ".join(arches))
-                        sys.stdout.write('\n')
-                    elif Options["Format"] in [ "control-suite", "heidi" ]:
-                        for arch in arches:
-                            sys.stdout.write("%s %s %s\n" % (pkg, version, arch))
-            if Options["GreaterOrEqual"]:
-                print "\n%s (>= %s)" % (pkg, highver[pkg])
-            if Options["GreaterThan"]:
-                print "\n%s (>> %s)" % (pkg, highver[pkg])
-
-    if not results:
-        sys.exit(1)
-
-#######################################################################################
+        kwargs['source_and_binary'] = True
+    if Options["Suite"]:
+        kwargs['suites'] = utils.split_args(Options['Suite'])
+    if Options["Architecture"]:
+        kwargs['architectures'] = utils.split_args(Options['Architecture'])
+    if Options['BinaryType']:
+        kwargs['binary_types'] = utils.split_args(Options['BinaryType'])
+    if Options['Component']:
+        kwargs['components'] = utils.split_args(Options['Component'])
+
+    if Options['Format']:
+        kwargs['format'] = Options['Format']
+    if Options['GreaterOrEqual']:
+        kwargs['highest'] = '>='
+    elif Options['GreaterThan']:
+        kwargs['highest'] = '>>'
+
+    for line in list_packages(packages, **kwargs):
+        print line
+
+######################################################################################
 
 if __name__ == '__main__':
     main()