initial commit
[ebuildfind.git] / commands / lib / layman / overlays / tar.py
blob5786931ab8dfeff9e43aa88f89f603606bcabaea
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 #################################################################################
4 # LAYMAN TAR OVERLAY HANDLER
5 #################################################################################
6 # File: tar.py
8 # Handles tar overlays
10 # Copyright:
11 # (c) 2005 - 2008 Gunnar Wrobel
12 # Distributed under the terms of the GNU General Public License v2
14 # Author(s):
15 # Gunnar Wrobel <wrobel@gentoo.org>
17 ''' Tar overlay support.'''
19 __version__ = "$Id: tar.py 310 2007-04-09 16:30:40Z wrobel $"
21 #===============================================================================
23 # Dependencies
25 #-------------------------------------------------------------------------------
27 import os, os.path, sys, urllib2, shutil
29 from layman.utils import path
30 from layman.overlays.overlay import Overlay
32 #===============================================================================
34 # Class TarOverlay
36 #-------------------------------------------------------------------------------
38 class TarOverlay(Overlay):
39 ''' Handles tar overlays.
41 A dummy tar handler that overwrites the __init__ method
42 so that we don't need to provide xml input:
44 >>> from layman.debug import OUT
45 >>> class DummyTar(TarOverlay):
46 ... def __init__(self):
47 ... self.name = 'dummy'
48 ... here = os.path.dirname(os.path.realpath(__file__))
49 ... self.src = 'file://' + here + '/../tests/testfiles/layman-test.tar.bz2'
50 ... self.subpath = 'layman-test'
51 ... self.format = 'bz2'
52 ... self.quiet = False
53 >>> testdir = os.tmpnam()
54 >>> os.mkdir(testdir)
55 >>> a = DummyTar()
56 >>> OUT.color_off()
57 >>> a.add(testdir) #doctest: +ELLIPSIS
58 * Running command "/bin/tar -v -x -j -f...
59 >>> sorted(os.listdir(testdir + '/dummy'))
60 ['app-admin', 'app-portage']
61 >>> shutil.rmtree(testdir)
62 '''
64 type = 'Tar'
66 binary = u'/bin/tar'
68 def __init__(self, xml, ignore = 0, quiet = False):
70 Overlay.__init__(self, xml, ignore)
72 if '&format' in self.data.keys():
73 self.format = self.data['&format']
74 else:
75 self.format = ''
77 if '&subpath' in self.data.keys():
78 self.subpath = self.data['&subpath']
79 else:
80 self.subpath = ''
82 if '&category' in self.data.keys():
83 if self.subpath:
84 raise Exception('Cannot use "category" and "subpath" at the same'
85 ' time!')
87 self.category = self.data['&category']
88 else:
89 self.category = ''
91 def add(self, base, quiet = False):
92 '''Add overlay.'''
94 self.supported()
96 mdir = path([base, self.name])
98 if os.path.exists(mdir):
99 raise Exception('Directory ' + mdir + ' already exists. Will not ov'
100 'erwrite its contents!')
102 if self.format == 'bz2' or (not self.format and self.src[-3:] == 'bz2'):
103 ext = 'bz2'
104 opt = '-j'
105 elif self.format == 'gz' or (not self.format and self.src[-2:] == 'gz'):
106 ext = 'gz'
107 opt = '-z'
108 else:
109 raise Exception('Unsupported file format!')
111 try:
113 tar = urllib2.urlopen(self.src).read()
115 except Exception, error:
116 raise Exception('Failed to fetch the tar package from: '
117 + self.src + '\nError was:' + str(error))
119 pkg = path([base, self.name + '.tar.' + ext])
121 try:
123 out_file = open(pkg, 'w')
124 out_file.write(tar)
125 out_file.close()
127 except Exception, error:
128 raise Exception('Failed to store tar package in '
129 + pkg + '\nError was:' + str(error))
131 if self.subpath:
132 target = path([base, 'tmp'])
133 else:
134 if self.category:
135 target = mdir + '/' + self.category
136 else:
137 target = mdir
139 os.makedirs(target)
141 result = self.cmd(self.binary + u' -v -x ' + opt + u' -f "' + pkg
142 + u'" -C "' + target + u'"')
144 if self.subpath:
145 source = target + '/' + self.subpath
146 if os.path.exists(source):
147 try:
148 os.rename(source, mdir)
149 except Exception, error:
150 raise Exception('Failed to rename tar subdirectory ' +
151 source + ' to ' + mdir + '\nError was:'
152 + str(error))
153 else:
154 raise Exception('Given subpath "' + source + '" does not exist '
155 ' in the tar package!')
156 try:
157 shutil.rmtree(target)
158 except Exception, error:
159 raise Exception('Failed to remove unnecessary tar structure "'
160 + target + '"\nError was:' + str(error))
162 os.unlink(pkg)
164 return result
166 def sync(self, base, quiet = False):
167 '''Sync overlay.'''
169 self.supported()
171 self.delete(base)
173 self.add(base)
175 def supported(self):
176 '''Overlay type supported?'''
178 return Overlay.supported(self, [(self.binary, 'tar', 'app-arch/tar'), ])
180 if __name__ == '__main__':
181 import doctest
183 # Ignore warnings here. We are just testing
184 from warnings import filterwarnings, resetwarnings
185 filterwarnings('ignore')
187 doctest.testmod(sys.modules[__name__])
189 resetwarnings()