Revert: Use join() rather than string printing.
[gentoolkit.git] / pym / gentoolkit / eshowkw / __init__.py
1 #       vim:fileencoding=utf-8
2 # Copyright 2010 Gentoo Foundation
3 # Distributed under the terms of the GNU General Public License v2
4
5 __package__ = 'gentoolkit.eshowkw'
6 __version__ = 'svn'
7 __author__ = "Tomáš Chvátal <scarabeus@gentoo.org>"
8
9 import portage
10
11 import sys, os, fnmatch
12 import argparse
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
18
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
23
24 ignore_slots = False
25 bold = False
26 order = 'bottom'
27 topper = 'versionlist'
28
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
40         else:
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)]
44                 content.extend(sep)
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)
49
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.')
55
56         parser.add_argument('-v', '--version', action='version', version=__version__, help='show package version and exit')
57
58         parser.add_argument('package', nargs='*', default=None, help='Packages to check.')
59
60         parser.add_argument('-a', '--arch', nargs='+', default=[], help='Display only specified arch(s)')
61
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.')
66
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.')
77
78         return parser.parse_args(args=argv)
79
80 def main(argv, indirect = False):
81         global ignore_slots, bold, order, topper
82
83         #opts parsing
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(',')
91         bold = opts.bold
92         order = opts.align
93         topper = opts.top_position
94         prefix = opts.prefix
95         color = opts.color
96         package = opts.package
97
98         # equery support
99         if indirect and len(package) <= 0:
100                 msg_err = 'No packages specified'
101                 raise SystemExit(msg_err)
102
103         # disable colors when redirected and they are not forced on
104         if not color and not sys.stdout.isatty():
105                 # disable colors
106                 porto.nocolor()
107         keywords = keywords_header(prefix, highlight_arch, order)
108         if len(package) > 0:
109                 dbapi = portdb[ports['ROOT']]['porttree'].dbapi
110                 if not use_overlays:
111                         dbapi.porttrees = [dbapi.porttree_root]
112                 map(lambda x: process_display(x, keywords, dbapi), package)
113         else:
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)
129         return 0
130
131 if __name__ == '__main__':
132         sys.exit(main(sys.argv[1:]))