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
|
# -*- coding: utf-8 -*-
#################################################################################
# LAYMAN OVERLAY SOURCE BASE CLASS
#################################################################################
# File: source.py
#
# Base class for the different overlay types.
#
# Copyright:
# (c) 2010 Sebastian Pipping
# Distributed under the terms of the GNU General Public License v2
#
# Author(s):
# Sebastian Pipping <sebastian@pipping.org>
import os
import sys
import shutil
import subprocess
from layman.debug import OUT
from layman.utils import path
def require_supported(binaries):
for command, mtype, package in binaries:
found = False
if os.path.isabs(command):
kind = 'Binary'
found = os.path.exists(command)
else:
kind = 'Command'
for d in os.environ['PATH'].split(os.pathsep):
f = os.path.join(d, command)
if os.path.exists(f):
found = True
break
if not found:
raise Exception(kind + ' ' + command + ' seems to be missing!'
' Overlay type "' + mtype + '" not support'
'ed. Did you emerge ' + package + '?')
return True
class OverlaySource(object):
type_key = None
def __init__(self, parent, xml, config, _location, ignore = 0, quiet = False):
self.parent = parent
self.src = _location
self.config = config
self.ignore = ignore
self.quiet = quiet
def __eq__(self, other):
return self.src == other.src
def __ne__(self, other):
return not self.__eq__(other)
def add(self, base, quiet = False):
'''Add the overlay.'''
mdir = path([base, self.parent.name])
if os.path.exists(mdir):
raise Exception('Directory ' + mdir + ' already exists. Will not ov'
'erwrite its contents!')
os.makedirs(mdir)
def sync(self, base, quiet = False):
'''Sync the overlay.'''
pass
def delete(self, base):
'''Delete the overlay.'''
mdir = path([base, self.parent.name])
if not os.path.exists(mdir):
OUT.warn('Directory ' + mdir + ' did not exist, no files deleted.')
return
OUT.info('Deleting directory "%s"' % mdir, 2)
shutil.rmtree(mdir)
def supported(self):
'''Is the overlay type supported?'''
return True
def is_supported(self):
'''Is the overlay type supported?'''
try:
self.supported()
return True
except:
return False
def command(self):
return self.config['%s_command' % self.__class__.type_key]
def cmd(self, command):
'''Run a command.'''
OUT.info('Running command "' + command + '"...', 2)
if hasattr(sys.stdout,'encoding'):
enc = sys.stdout.encoding or sys.getfilesystemencoding()
if enc:
command = command.encode(enc)
if not self.quiet:
return os.system(command)
else:
cmd = subprocess.Popen([command], shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
close_fds = True)
result = cmd.wait()
return result
def to_xml_hook(self, repo_elem):
pass
|