1#! /usr/bin/env python3
3"""
4Display information about package(s) (suite, version, etc.)
6@contact: Debian FTP Master <ftpmaster@debian.org>
7@copyright: 2000, 2001, 2002, 2003, 2004, 2005, 2006 James Troup <james@nocrew.org>
8@license: GNU General Public License version 2 or later
10"""
11# This program is free software; you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation; either version 2 of the License, or
14# (at your option) any later version.
16# This program is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
21# You should have received a copy of the GNU General Public License
22# along with this program; if not, write to the Free Software
23# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25################################################################################
27# <aj> ooo, elmo has "special powers"
28# <neuro> ooo, does he have lasers that shoot out of his eyes?
29# <aj> dunno
30# <aj> maybe he can turn invisible? that'd sure help with improved transparency!
32################################################################################
34import sys
36import apt_pkg
38from daklib import utils
39from daklib.config import Config
40from daklib.ls import list_packages
42################################################################################
45def usage(exit_code=0):
46 print(
47 """Usage: dak ls [OPTION] PACKAGE[...]
48Display information about PACKAGE(s).
50 -a, --architecture=ARCH only show info for ARCH(s)
51 -b, --binary-type=TYPE only show info for binary TYPE
52 -c, --component=COMPONENT only show info for COMPONENT(s)
53 -g, --greaterorequal show buildd 'dep-wait pkg >= {highest version}' info
54 -G, --greaterthan show buildd 'dep-wait pkg >> {highest version}' info
55 -h, --help show this help and exit
56 -r, --regex treat PACKAGE as a regex
57 -s, --suite=SUITE only show info for this suite
58 -S, --source-and-binary show info for the binary children of source pkgs
59 -f, --format=control-suite use same format as control-suite for output
61ARCH, COMPONENT and SUITE can be comma (or space) separated lists, e.g.
62 --architecture=amd64,i386"""
63 )
64 sys.exit(exit_code)
67################################################################################
70def main():
71 cnf = Config()
73 Arguments = [
74 ("a", "architecture", "Ls::Options::Architecture", "HasArg"),
75 ("b", "binarytype", "Ls::Options::BinaryType", "HasArg"),
76 ("c", "component", "Ls::Options::Component", "HasArg"),
77 ("f", "format", "Ls::Options::Format", "HasArg"),
78 ("g", "greaterorequal", "Ls::Options::GreaterOrEqual"),
79 ("G", "greaterthan", "Ls::Options::GreaterThan"),
80 ("r", "regex", "Ls::Options::Regex"),
81 ("s", "suite", "Ls::Options::Suite", "HasArg"),
82 ("S", "source-and-binary", "Ls::Options::Source-And-Binary"),
83 ("h", "help", "Ls::Options::Help"),
84 ]
85 for i in [
86 "architecture",
87 "binarytype",
88 "component",
89 "format",
90 "greaterorequal",
91 "greaterthan",
92 "regex",
93 "suite",
94 "source-and-binary",
95 "help",
96 ]:
97 key = "Ls::Options::%s" % i
98 if key not in cnf: 98 ↛ 85line 98 didn't jump to line 85
99 cnf[key] = ""
101 packages = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv)
102 Options = cnf.subtree("Ls::Options")
104 if Options["Help"]:
105 usage()
106 if not packages: 106 ↛ 107line 106 didn't jump to line 107, because the condition on line 106 was never true
107 utils.fubar("need at least one package name as an argument.")
109 # Handle buildd maintenance helper options
110 if Options["GreaterOrEqual"] or Options["GreaterThan"]: 110 ↛ 111line 110 didn't jump to line 111, because the condition on line 110 was never true
111 if Options["GreaterOrEqual"] and Options["GreaterThan"]:
112 utils.fubar(
113 "-g/--greaterorequal and -G/--greaterthan are mutually exclusive."
114 )
115 if not Options["Suite"]:
116 Options["Suite"] = "unstable"
118 kwargs = dict()
120 if Options["Regex"]: 120 ↛ 121line 120 didn't jump to line 121, because the condition on line 120 was never true
121 kwargs["regex"] = True
122 if Options["Source-And-Binary"]:
123 kwargs["source_and_binary"] = True
124 if Options["Suite"]:
125 kwargs["suites"] = utils.split_args(Options["Suite"])
126 if Options["Architecture"]: 126 ↛ 127line 126 didn't jump to line 127, because the condition on line 126 was never true
127 kwargs["architectures"] = utils.split_args(Options["Architecture"])
128 if Options["BinaryType"]: 128 ↛ 129line 128 didn't jump to line 129, because the condition on line 128 was never true
129 kwargs["binary_types"] = utils.split_args(Options["BinaryType"])
130 if Options["Component"]: 130 ↛ 131line 130 didn't jump to line 131, because the condition on line 130 was never true
131 kwargs["components"] = utils.split_args(Options["Component"])
133 if Options["Format"]: 133 ↛ 134line 133 didn't jump to line 134, because the condition on line 133 was never true
134 kwargs["format"] = Options["Format"]
135 if Options["GreaterOrEqual"]: 135 ↛ 136line 135 didn't jump to line 136, because the condition on line 135 was never true
136 kwargs["highest"] = ">="
137 elif Options["GreaterThan"]: 137 ↛ 138line 137 didn't jump to line 138, because the condition on line 137 was never true
138 kwargs["highest"] = ">>"
140 for line in list_packages(packages, **kwargs):
141 print(line)
144######################################################################################
147if __name__ == "__main__":
148 main()