1 # vim:fileencoding=utf-8
2 # Copyright 2010 Gentoo Foundation
3 # Distributed under the terms of the GNU General Public License v2
5 __package__ = 'gentoolkit.eshowkw'
7 __author__ = "Tomáš Chvátal <scarabeus@gentoo.org>"
11 import sys, os, fnmatch
13 from portage import output as porto
14 from portage import settings as ports
15 from portage import config as portc
16 from portage import portdbapi as portdbapi
17 from portage import db as portdb
19 from .keywords_header import keywords_header
20 from .keywords_content import keywords_content
21 from .display_pretty import string_rotator
22 from .display_pretty import display
27 topper = 'versionlist'
29 def process_display(package, keywords, dbapi):
30 portdata = keywords_content(package, keywords.keywords, dbapi, ignore_slots, order, bold, topper)
31 if topper == 'archlist':
32 header = string_rotator().rotateContent(keywords.content, keywords.length, bold)
33 extra = string_rotator().rotateContent(keywords.extra, keywords.length, bold, False)
34 # -1 : space is taken in account and appended by us
35 filler = ''.ljust(portdata.slot_length-1)
36 header = ['%s%s%s' % (x, filler, y) for x, y in zip(header, extra)]
37 content = portdata.content
38 header_length = portdata.version_length
39 content_length = keywords.length
41 header = string_rotator().rotateContent(portdata.content, portdata.content_length, bold)
42 content = keywords.content
43 sep = [''.ljust(keywords.length) for x in range(portdata.slot_length-1)]
45 content.extend(keywords.extra)
46 header_length = keywords.length
47 content_length = portdata.version_length
48 display(content, header, header_length, content_length, portdata.cp, topper)
50 def process_args(argv):
51 """Option parsing via argc"""
52 parser = argparse.ArgumentParser(prog=__package__,
53 formatter_class=argparse.ArgumentDefaultsHelpFormatter,
54 description='Display keywords for specified package or for package that is in pwd.')
56 parser.add_argument('-v', '--version', action='version', version=__version__, help='show package version and exit')
58 parser.add_argument('package', nargs='*', default=None, help='Packages to check.')
60 parser.add_argument('-a', '--arch', nargs='+', default=[], help='Display only specified arch(s)')
62 parser.add_argument('-A', '--align', nargs='?', default='bottom', choices=['top', 'bottom'],
63 help='Specify alignment for descriptions.')
64 parser.add_argument('-T', '--top-position', nargs='?', default='archlist', choices=['archlist', 'versionlist'],
65 help='Specify which fields we want to have in top listing.')
67 parser.add_argument('-B', '--bold', action='store_true', default=False,
68 help='Print out each other column in bold for easier visual separation.')
69 parser.add_argument('-C', '--color', action='store_true', default=False,
70 help='Force colored output')
71 parser.add_argument('-O', '--overlays', action='store_true', default=False,
72 help='Search also overlays')
73 parser.add_argument('-P', '--prefix', action='store_true', default=False,
74 help='Display prefix keywords in output.')
75 parser.add_argument('-S', '--ignore-slot', action='store_true', default=False,
76 help='Treat slots as irelevant during detection of redundant pacakges.')
78 return parser.parse_args(args=argv)
80 def main(argv, indirect = False):
81 global ignore_slots, bold, order, topper
84 opts = process_args(argv)
85 ignore_slots = opts.ignore_slot
86 use_overlays = opts.overlays
87 # user can do both --arch=a,b,c or --arch a b c
88 if len(opts.arch) > 1:
89 opts.arch = ','.join(opts.arch)
90 highlight_arch = ''.join(opts.arch).split(',')
93 topper = opts.top_position
96 package = opts.package
99 if indirect and len(package) <= 0:
100 msg_err = 'No packages specified'
101 raise SystemExit(msg_err)
103 # disable colors when redirected and they are not forced on
104 if not color and not sys.stdout.isatty():
107 keywords = keywords_header(prefix, highlight_arch, order)
109 dbapi = portdb[ports['ROOT']]['porttree'].dbapi
111 dbapi.porttrees = [dbapi.porttree_root]
112 map(lambda x: process_display(x, keywords, dbapi), package)
114 currdir = os.getcwd()
115 # check if there are actualy some ebuilds
116 ebuilds = ['%s' % x for x in os.listdir(currdir)
117 if fnmatch.fnmatch(x, '*.ebuild')]
118 if len(ebuilds) <= 0:
119 msg_err = 'No ebuilds at "%s"' % currdir
120 raise SystemExit(msg_err)
121 package= '%s/%s' % (os.path.basename(os.path.abspath('../')), os.path.basename(currdir))
122 ourtree = os.path.abspath('../../')
123 overlays = '%s %s' % (ports['PORTDIR_OVERLAY'], ourtree)
124 mysettings = portc(env={'PORTDIR_OVERLAY': overlays})
125 dbapi = portdbapi(mysettings=mysettings)
126 # specify that we want just our nice tree we are in cwd
127 dbapi.porttrees = [ourtree]
128 process_display(package, keywords, dbapi)
131 if __name__ == '__main__':
132 sys.exit(main(sys.argv[1:]))