github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/acceptancetests/repository/trusty/haproxy/hooks/charmhelpers/fetch/giturl.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('GitPython does not support Python 3') 27 28 try: 29 from git import Repo 30 except ImportError: 31 from charmhelpers.fetch import apt_install 32 apt_install("python-git") 33 from git import Repo 34 35 from git.exc import GitCommandError # noqa E402 36 37 38 class GitUrlFetchHandler(BaseFetchHandler): 39 """Handler for git branches via generic and github URLs""" 40 def can_handle(self, source): 41 url_parts = self.parse_url(source) 42 # TODO (mattyw) no support for ssh git@ yet 43 if url_parts.scheme not in ('http', 'https', 'git'): 44 return False 45 else: 46 return True 47 48 def clone(self, source, dest, branch): 49 if not self.can_handle(source): 50 raise UnhandledSource("Cannot handle {}".format(source)) 51 52 repo = Repo.clone_from(source, dest) 53 repo.git.checkout(branch) 54 55 def install(self, source, branch="master", dest=None): 56 url_parts = self.parse_url(source) 57 branch_name = url_parts.path.strip("/").split("/")[-1] 58 if dest: 59 dest_dir = os.path.join(dest, branch_name) 60 else: 61 dest_dir = os.path.join(os.environ.get('CHARM_DIR'), "fetched", 62 branch_name) 63 if not os.path.exists(dest_dir): 64 mkdir(dest_dir, perms=0o755) 65 try: 66 self.clone(source, dest_dir, branch) 67 except GitCommandError as e: 68 raise UnhandledSource(e.message) 69 except OSError as e: 70 raise UnhandledSource(e.strerror) 71 return dest_dir