2 # -*- coding: utf-8 -*-
3 #################################################################################
4 # LAYMAN TAR OVERLAY HANDLER
5 #################################################################################
11 # (c) 2005 - 2008 Gunnar Wrobel
12 # Distributed under the terms of the GNU General Public License v2
15 # Gunnar Wrobel <wrobel@gentoo.org>
17 ''' Tar overlay support.'''
19 __version__
= "$Id: tar.py 310 2007-04-09 16:30:40Z wrobel $"
21 #===============================================================================
25 #-------------------------------------------------------------------------------
27 import os
, os
.path
, sys
, urllib2
, shutil
29 from layman
.utils
import path
30 from layman
.overlays
.overlay
import Overlay
32 #===============================================================================
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()
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)
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']
77 if '&subpath' in self
.data
.keys():
78 self
.subpath
= self
.data
['&subpath']
82 if '&category' in self
.data
.keys():
84 raise Exception('Cannot use "category" and "subpath" at the same'
87 self
.category
= self
.data
['&category']
91 def add(self
, base
, quiet
= False):
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'):
105 elif self
.format
== 'gz' or (not self
.format
and self
.src
[-2:] == 'gz'):
109 raise Exception('Unsupported file format!')
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
])
123 out_file
= open(pkg
, 'w')
127 except Exception, error
:
128 raise Exception('Failed to store tar package in '
129 + pkg
+ '\nError was:' + str(error
))
132 target
= path([base
, 'tmp'])
135 target
= mdir
+ '/' + self
.category
141 result
= self
.cmd(self
.binary
+ u
' -v -x ' + opt
+ u
' -f "' + pkg
142 + u
'" -C "' + target
+ u
'"')
145 source
= target
+ '/' + self
.subpath
146 if os
.path
.exists(source
):
148 os
.rename(source
, mdir
)
149 except Exception, error
:
150 raise Exception('Failed to rename tar subdirectory ' +
151 source
+ ' to ' + mdir
+ '\nError was:'
154 raise Exception('Given subpath "' + source
+ '" does not exist '
155 ' in the tar package!')
157 shutil
.rmtree(target
)
158 except Exception, error
:
159 raise Exception('Failed to remove unnecessary tar structure "'
160 + target
+ '"\nError was:' + str(error
))
166 def sync(self
, base
, quiet
= False):
176 '''Overlay type supported?'''
178 return Overlay
.supported(self
, [(self
.binary
, 'tar', 'app-arch/tar'), ])
180 if __name__
== '__main__':
183 # Ignore warnings here. We are just testing
184 from warnings
import filterwarnings
, resetwarnings
185 filterwarnings('ignore')
187 doctest
.testmod(sys
.modules
[__name__
])