view foodtruck/scm/git.py @ 660:9f391ab1b4e0

admin: Add support for Git source-control.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 27 Feb 2016 22:00:52 -0800
parents
children 8d633ca59bc5
line wrap: on
line source

import os
import logging
import tempfile
import subprocess
from .base import SourceControl, RepoStatus, _s


logger = logging.getLogger(__name__)


class GitSourceControl(SourceControl):
    def __init__(self, root_dir, cfg):
        super(GitSourceControl, self).__init__(root_dir, cfg)
        self.git = cfg.get('exe', 'git')

    def getStatus(self):
        res = RepoStatus()
        st_out = self._run('status', '-s')
        print(st_out)
        for line in st_out.split('\n'):
            print(line)
            if not line:
                continue
            if line.startswith('?? '):
                path = line[3:].strip()
                if path[-1] == '/':
                    import glob
                    res.new_files += [
                            f for f in glob.glob(path + '**', recursive=True)
                            if f[-1] != '/']
                else:
                    res.new_files.append(path)
            elif line.startswith(' M '):
                res.edited_files.append(path[3:])
        print(res.__dict__)
        return res

    def _doCommit(self, paths, message, author):
        self._run('add', *paths)

        # Create a temp file with the commit message.
        f, temp = tempfile.mkstemp()
        with os.fdopen(f, 'w') as fd:
            fd.write(message)

        # Commit and clean up the temp file.
        try:
            commit_args = list(paths) + ['-F', temp]
            if author:
                commit_args += ['--author="%s"' % author]
            self._run('commit', *commit_args)
        finally:
            os.remove(temp)

    def _run(self, cmd, *args, **kwargs):
        exe = [self.git]
        exe.append(cmd)
        exe += args

        logger.debug("Running Git: " + str(exe))
        proc = subprocess.Popen(
                exe, stdout=subprocess.PIPE, cwd=self.root_dir)
        out, _ = proc.communicate()

        encoded_out = _s(out)
        return encoded_out