diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foodtruck/scm/git.py	Sat Feb 27 22:00:52 2016 -0800
@@ -0,0 +1,67 @@
+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
+