1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# Copyright(c) 2009, Gentoo Foundation
#
# Licensed under the GNU General Public License, v2
#
# $Header: $
"""Display the path to the ebuild that would be used by Portage with the current
configuration
"""
from __future__ import print_function
__docformat__ = 'epytext'
# =======
# Imports
# =======
import os
import sys
from getopt import gnu_getopt, GetoptError
import gentoolkit.pprinter as pp
from gentoolkit import errors
from gentoolkit.equery import format_options, mod_usage
from gentoolkit.query import Query
from portage import _encodings, _unicode_decode, _unicode_encode
# =======
# Globals
# =======
QUERY_OPTS = {
"include_masked": False,
"ebuild":False
}
# =========
# Functions
# =========
def print_help(with_description=True):
"""Print description, usage and a detailed help message.
@type with_description: bool
@param with_description: if true, print module's __doc__ string
"""
if with_description:
print(__doc__.strip())
print()
print(mod_usage(mod_name="which"))
print()
print(pp.command("options"))
print(format_options((
(" -h, --help", "display this help message"),
(" -m, --include-masked", "return highest version ebuild available"),
(" -e, --ebuild", "print the ebuild")
)))
def print_ebuild(ebuild_path):
"""Output the ebuild to std_out"""
with open(_unicode_encode(ebuild_path, encoding=_encodings['fs'])) as f:
lines = f.readlines()
print("\n\n")
print("".join(lines))
print("\n")
def parse_module_options(module_opts):
"""Parse module options and update QUERY_OPTS"""
opts = (x[0] for x in module_opts)
for opt in opts:
if opt in ('-h', '--help'):
print_help()
sys.exit(0)
elif opt in ('-m', '--include-masked'):
QUERY_OPTS['include_masked'] = True
elif opt in ('-e', '--ebuild'):
QUERY_OPTS['ebuild'] = True
def main(input_args):
"""Parse input and run the program"""
short_opts = "hme"
long_opts = ('help', 'include-masked', 'ebuild')
try:
module_opts, queries = gnu_getopt(input_args, short_opts, long_opts)
except GetoptError as err:
sys.stderr.write(pp.error("Module %s" % err))
print()
print_help(with_description=False)
sys.exit(2)
parse_module_options(module_opts)
if not queries:
print_help()
sys.exit(2)
for query in (Query(x) for x in queries):
matches = query.find(
include_masked=QUERY_OPTS['include_masked'],
in_installed=False
)
if matches:
pkg = sorted(matches).pop()
ebuild_path = pkg.ebuild_path()
if ebuild_path:
pp.uprint(os.path.normpath(ebuild_path))
if QUERY_OPTS['ebuild']:
print_ebuild(ebuild_path)
else:
sys.stderr.write(
pp.warn("No ebuilds to satisfy %s" % pkg.cpv)
)
else:
raise errors.GentoolkitNoMatches(query)
# vim: set ts=4 sw=4 tw=79:
|