summaryrefslogtreecommitdiffstats
path: root/src/lib/Client/Tools/VCS.py
diff options
context:
space:
mode:
authorSol Jerome <sol.jerome@gmail.com>2012-03-24 11:20:07 -0500
committerSol Jerome <sol.jerome@gmail.com>2012-03-24 11:20:07 -0500
commitdab1d03d81c538966d03fb9318a4588a9e803b44 (patch)
treef51e27fa55887e9fb961766805fe43f0da56c5b9 /src/lib/Client/Tools/VCS.py
parent5cd6238df496a3cea178e4596ecd87967cce1ce6 (diff)
downloadbcfg2-dab1d03d81c538966d03fb9318a4588a9e803b44.tar.gz
bcfg2-dab1d03d81c538966d03fb9318a4588a9e803b44.tar.bz2
bcfg2-dab1d03d81c538966d03fb9318a4588a9e803b44.zip
Allow to run directly from a git checkout (#1037)
Signed-off-by: Sol Jerome <sol.jerome@gmail.com>
Diffstat (limited to 'src/lib/Client/Tools/VCS.py')
-rw-r--r--src/lib/Client/Tools/VCS.py150
1 files changed, 0 insertions, 150 deletions
diff --git a/src/lib/Client/Tools/VCS.py b/src/lib/Client/Tools/VCS.py
deleted file mode 100644
index e6081dc1c..000000000
--- a/src/lib/Client/Tools/VCS.py
+++ /dev/null
@@ -1,150 +0,0 @@
-"""VCS support."""
-
-# TODO:
-# * git_write_index
-# * add svn support
-# * integrate properly with reports
-missing = []
-
-import os
-import shutil
-import sys
-# python-dulwich git imports
-try:
- import dulwich
- import dulwich.index
- from dulwich.errors import NotGitRepository
-except:
- missing.append('git')
-# subversion import
-try:
- import pysvn
-except:
- missing.append('svn')
-
-import Bcfg2.Client.Tools
-
-
-class VCS(Bcfg2.Client.Tools.Tool):
- """VCS support."""
- name = 'VCS'
- __handles__ = [('Path', 'vcs')]
- __req__ = {'Path': ['name',
- 'type',
- 'vcstype',
- 'sourceurl',
- 'revision']}
-
- def __init__(self, logger, cfg, setup):
- Bcfg2.Client.Tools.Tool.__init__(self, logger, cfg, setup)
- self.cfg = cfg
-
- def git_write_index(self, entry):
- """Write the git index"""
- pass
-
- def Verifygit(self, entry, _):
- """Verify git repositories"""
- try:
- repo = dulwich.repo.Repo(entry.get('name'))
- except NotGitRepository:
- self.logger.info("Repository %s does not exist" %
- entry.get('name'))
- return False
- cur_rev = repo.head()
-
- if cur_rev != entry.get('revision'):
- self.logger.info("At revision %s need to go to revision %s" %
- (cur_rev, entry.get('revision')))
- return False
-
- return True
-
- def Installgit(self, entry):
- """Checkout contents from a git repository"""
- destname = entry.get('name')
- if os.path.lexists(destname):
- # remove incorrect contents
- try:
- if os.path.isdir(destname):
- shutil.rmtree(destname)
- else:
- os.remove(destname)
- except OSError:
- self.logger.info('Failed to remove %s' % \
- destname)
- return False
-
- destr = dulwich.repo.Repo.init(destname, mkdir=True)
- cl, host_path = dulwich.client.get_transport_and_path(entry.get('sourceurl'))
- remote_refs = cl.fetch(host_path,
- destr,
- determine_wants=destr.object_store.determine_wants_all,
- progress=sys.stdout.write)
- destr.refs['refs/heads/master'] = entry.get('revision')
- dtree = destr[entry.get('revision')].tree
- obj_store = destr.object_store
- for fname, mode, sha in obj_store.iter_tree_contents(dtree):
- fullpath = os.path.join(destname, fname)
- try:
- f = open(os.path.join(destname, fname), 'wb')
- except IOError:
- dir = os.path.split(fullpath)[0]
- os.makedirs(dir)
- f = open(os.path.join(destname, fname), 'wb')
- f.write(destr[sha].data)
- f.close()
- os.chmod(os.path.join(destname, fname), mode)
- return True
- # FIXME: figure out how to write the git index properly
- #iname = "%s/.git/index" % entry.get('name')
- #f = open(iname, 'w+')
- #entries = obj_store[sha].iteritems()
- #try:
- # dulwich.index.write_index(f, entries)
- #finally:
- # f.close()
-
- def Verifysvn(self, entry, _):
- """Verify svn repositories"""
- client = pysvn.Client()
- try:
- cur_rev = str(client.info(entry.get('name')).revision.number)
- except:
- self.logger.info("Repository %s does not exist" % entry.get('name'))
- return False
-
- if cur_rev != entry.get('revision'):
- self.logger.info("At revision %s need to go to revision %s" %
- (cur_rev, entry.get('revision')))
- return False
-
- return True
-
- def Installsvn(self, entry):
- """Checkout contents from a svn repository"""
- try:
- client = pysvn.Client.update(entry.get('name'), recurse=True)
- except:
- self.logger.error("Failed to update repository", exc_info=1)
- return False
-
- return True
-
- def VerifyPath(self, entry, _):
- vcs = entry.get('vcstype')
- if vcs in missing:
- self.logger.error("Missing %s python libraries. Cannot verify" %
- vcs)
- return False
- ret = getattr(self, 'Verify%s' % vcs)
- return ret(entry, _)
-
- def InstallPath(self, entry):
- vcs = entry.get('vcstype')
- if vcs in missing:
- self.logger.error("Missing %s python libraries. "
- "Unable to install" % vcs)
- return False
- ret = getattr(self, 'Install%s' % vcs)
- return ret(entry)