/
g-octave
executable file
·249 lines (203 loc) · 7.52 KB
/
g-octave
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
# This block ensures that ^C interrupts are handled quietly.
# Code snippet from Portage
try:
import signal
def exithandler(signum,frame):
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGTERM, signal.SIG_IGN)
sys.exit(1)
signal.signal(signal.SIGINT, exithandler)
signal.signal(signal.SIGTERM, exithandler)
except KeyboardInterrupt:
sys.exit(1)
import os
import optparse
import portage
import subprocess
out = portage.output.EOutput()
current_dir = os.path.dirname(os.path.realpath(__file__))
if os.path.exists(os.path.join(current_dir, '..', 'g_octave')):
sys.path.insert(0, os.path.join(current_dir, '..'))
import g_octave
def main():
parser = optparse.OptionParser(
usage = '%prog [options] <package_name | package_name-version>',
version = '%prog ' + g_octave.__version__,
description = g_octave.__description__
)
parser.add_option(
'-l', '--list',
action = 'store_true',
dest = 'list',
default = False,
help = 'show a list of packages available to install and exit'
)
parser.add_option(
'-i', '--info',
action = 'store_true',
dest = 'info',
default = False,
help = 'show a description of the required package and exit'
)
parser.add_option(
'-p', '--pretend',
action = 'store_true',
dest = 'pretend',
default = False,
help = 'don\'t (un)merge packages, only create ebuilds and solve the dependencies'
)
parser.add_option(
'-a', '--ask',
action = 'store_true',
dest = 'ask',
default = False,
help = 'ask to confirmation before perform (un)merges'
)
parser.add_option(
'-v', '--verbose',
action = 'store_true',
dest = 'verbose',
default = False,
help = 'Portage makes a lot of noise.'
)
parser.add_option(
'-C', '--unmerge',
action = 'store_true',
dest = 'unmerge',
default = False,
help = 'try to unmerge a package instead of merge'
)
parser.add_option(
'-f', '--force',
action = 'store_true',
dest = 'force',
default = False,
help = 'forces the recreation of the ebuilds'
)
parser.add_option(
'--force-all',
action = 'store_true',
dest = 'force_all',
default = False,
help = 'forces the recreation of the overlay and of the ebuilds'
)
parser.add_option(
'--no-colors',
action = 'store_false',
dest = 'colors',
default = True,
help = 'don\'t use colors on the CLI'
)
options, args = parser.parse_args()
if not options.colors:
portage.output.nocolor()
from g_octave.config import Config
from g_octave.fetch import check_updates, download_files, check_db_cache
conf_prefetch = Config(True)
# checking if our overlay is correctly added to PORTDIR_OVERLAY
if conf_prefetch.overlay not in portage.settings['PORTDIR_OVERLAY'].split(' '):
out.eerror('g-octave overlay is not configured!')
out.eerror('You must append your overlay dir to PORTDIR_OVERLAY.')
out.eerror('Overlay: %s' % conf_prefetch.overlay)
sys.exit(1)
out.einfo('Looking for updates. Some download may be needed.')
print
check_updates()
download_files()
check_db_cache()
conf = Config()
from g_octave.description import Description
from g_octave.description_tree import DescriptionTree
from g_octave.ebuild import Ebuild, EbuildException
from g_octave.overlay import create_overlay
if options.list:
tree = DescriptionTree()
print portage.output.blue('Available packages:\n')
for category in tree.pkg_list:
print portage.output.white('%s:') % category
for pkg in tree.pkg_list[category]:
print '\t%s-%s' % (pkg['name'], pkg['version'])
print
sys,exit(0)
elif len(args) == 0:
out.eerror('You need provide a package atom or the option "--list"')
sys.exit(1)
elif len(args) > 1:
out.eerror('At this moment g-octave can install only one package at once')
sys.exit(1)
# if we're alive yet, we have a package to install! :D
create_overlay(options.force_all)
try:
ebuild = Ebuild(args[0], options.force or options.force_all)
except EbuildException:
out.eerror('Package not found: %s' % args[0])
sys.exit(1)
if options.info:
pkg = ebuild.description()
print portage.output.blue('Package:'), portage.output.white(str(pkg.name))
print portage.output.blue('Version:'), portage.output.white(str(pkg.version))
print portage.output.blue('Date:'), portage.output.white(str(pkg.date))
print portage.output.blue('Maintainer:'), portage.output.white(str(pkg.maintainer))
print portage.output.blue('Description:'), portage.output.white(str(pkg.description))
print portage.output.blue('Categories:'), portage.output.white(str(pkg.categories))
print portage.output.blue('License:'), portage.output.white(str(pkg.license))
print portage.output.blue('Url:'), portage.output.white(str(pkg.url))
sys.exit(0)
out.einfo('Creating the ebuilds to install: %s' % args[0])
atom = ebuild.create()
out.einfo('Now we\'ll call emerge to do the rest of the job!')
emerge = ['emerge']
options.ask and emerge.append('--ask')
options.verbose and emerge.append('--verbose')
options.pretend and emerge.append('--pretend')
options.unmerge and emerge.append('--unmerge')
if not options.colors:
emerge.append('--color=n')
emerge.append(atom)
if subprocess.call(emerge) != 0:
out.eerror('emerge returned an error.')
sys.exit(1)
if options.unmerge:
out.einfo('You may want to remove the dependencies too, using:')
out.einfo('# emerge -av --depclean')
sys.exit(0)
if __name__ == '__main__':
from g_octave.exception import *
try:
main()
sys.exit(0)
except ConfigException, error:
out.eerror('Config class error - %s' % error)
sys.exit(1)
except DescriptionException, error:
out.eerror('Description class error - %s' % error)
sys.exit(1)
except DescriptionTreeException, error:
out.eerror('DescriptionTree class error - %s' % error)
sys.exit(1)
except EbuildException, error:
out.eerror('Ebuild class error - %s' % error)
sys.exit(1)
except FetchException, error:
out.eerror('Fetch module error - %s' % error)
sys.exit(1)
except OSError, error:
out.eerror('Operating System error - %s' % error)
out.eerror('Try run "g-octave" as root.')
sys.exit(1)
except IOError, error:
out.eerror('I/O error - %s' % error)
out.eerror('Try run "g-octave" as root.')
sys.exit(1)
except KeyError, error:
out.eerror('Key error - %s' % error)
out.eerror('Probably you have more than one overlay configured to use with g-octave')
out.eerror('Try remove the oldest and maintain only the overlay actually in use.')
sys.exit(1)
except Exception, error:
out.eerror('Unknown error - %s' % error)
out.eerror('If you fell that this is a bug, please report to us.')
sys.exit(1)