Source code for nuka.tasks.git

# -*- coding: utf-8 -*-
"""
git related tasks
"""
import os
import logging as log
from nuka.task import Task


[docs]class git(Task): """git clone/fetch""" def __init__(self, src=None, dst=None, branch=None, tag=None, **kwargs): kwargs.setdefault('name', src) kwargs.update(src=src, dst=dst, branch=branch, tag=tag) super(git, self).__init__(**kwargs) def pre_process(self): if self.args['branch'] and self.args['tag']: raise RuntimeError('Do not use both tag and branch') if self.args['branch'] is None and self.args['tag'] is None: self.args['branch'] = 'master' if self.args['tag']: self.args['depth'] = 1 def current_ref(self): ref = self.sh(['git', 'rev-parse', 'HEAD'], check=False) if ref['rc'] == 0: ref = ref['stdout'].strip() return ref def do(self): src = self.args['src'] dst = self.args['dst'] branch = self.args['branch'] tag = self.args['tag'] ref = branch or tag cmd = ['git'] if os.path.isdir(dst): old_ref = self.current_ref() os.chdir(dst) cmd.append('fetch') if tag: cmd.append('--depth=1') cmd.extend([src, ref]) else: old_ref = None cmd += ['clone'] if tag: cmd.extend([ '--depth=1', '--single-branch', '-b', tag, '--depth=1']) cmd.extend([src, dst]) log.info(cmd) self.sh(cmd) os.chdir(dst) if tag: self.sh(['git', 'fetch', '--tags']) res = self.sh(['git', 'checkout', ref]) res['changed'] = old_ref != self.current_ref() return res