github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/acceptancetests/repository/trusty/haproxy/hooks/charmhelpers/fetch/bzrurl.py (about) 1 # Copyright 2014-2015 Canonical Limited. 2 # 3 # This file is part of charm-helpers. 4 # 5 # charm-helpers is free software: you can redistribute it and/or modify 6 # it under the terms of the GNU Lesser General Public License version 3 as 7 # published by the Free Software Foundation. 8 # 9 # charm-helpers is distributed in the hope that it will be useful, 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 # GNU Lesser General Public License for more details. 13 # 14 # You should have received a copy of the GNU Lesser General Public License 15 # along with charm-helpers. If not, see <http://www.gnu.org/licenses/>. 16 17 import os 18 from charmhelpers.fetch import ( 19 BaseFetchHandler, 20 UnhandledSource 21 ) 22 from charmhelpers.core.host import mkdir 23 24 import six 25 if six.PY3: 26 raise ImportError('bzrlib does not support Python3') 27 28 try: 29 from bzrlib.branch import Branch 30 from bzrlib import bzrdir, workingtree, errors 31 except ImportError: 32 from charmhelpers.fetch import apt_install 33 apt_install("python-bzrlib") 34 from bzrlib.branch import Branch 35 from bzrlib import bzrdir, workingtree, errors 36 37 38 class BzrUrlFetchHandler(BaseFetchHandler): 39 """Handler for bazaar branches via generic and lp URLs""" 40 def can_handle(self, source): 41 url_parts = self.parse_url(source) 42 if url_parts.scheme not in ('bzr+ssh', 'lp'): 43 return False 44 else: 45 return True 46 47 def branch(self, source, dest): 48 url_parts = self.parse_url(source) 49 # If we use lp:branchname scheme we need to load plugins 50 if not self.can_handle(source): 51 raise UnhandledSource("Cannot handle {}".format(source)) 52 if url_parts.scheme == "lp": 53 from bzrlib.plugin import load_plugins 54 load_plugins() 55 try: 56 local_branch = bzrdir.BzrDir.create_branch_convenience(dest) 57 except errors.AlreadyControlDirError: 58 local_branch = Branch.open(dest) 59 try: 60 remote_branch = Branch.open(source) 61 remote_branch.push(local_branch) 62 tree = workingtree.WorkingTree.open(dest) 63 tree.update() 64 except Exception as e: 65 raise e 66 67 def install(self, source): 68 url_parts = self.parse_url(source) 69 branch_name = url_parts.path.strip("/").split("/")[-1] 70 dest_dir = os.path.join(os.environ.get('CHARM_DIR'), "fetched", 71 branch_name) 72 if not os.path.exists(dest_dir): 73 mkdir(dest_dir, perms=0o755) 74 try: 75 self.branch(source, dest_dir) 76 except OSError as e: 77 raise UnhandledSource(e.strerror) 78 return dest_dir