Mercurial > piecrust2
comparison piecrust/admin/scm/git.py @ 778:5e91bc0e3b4d
internal: Move admin panel code into the piecrust package.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Sat, 16 Jul 2016 15:02:24 +0200 |
| parents | foodtruck/scm/git.py@8d633ca59bc5 |
| children | 82509bce94ca |
comparison
equal
deleted
inserted
replaced
| 777:8d633ca59bc5 | 778:5e91bc0e3b4d |
|---|---|
| 1 import os | |
| 2 import logging | |
| 3 import tempfile | |
| 4 import subprocess | |
| 5 from .base import SourceControl, RepoStatus, _s | |
| 6 | |
| 7 | |
| 8 logger = logging.getLogger(__name__) | |
| 9 | |
| 10 | |
| 11 class GitSourceControl(SourceControl): | |
| 12 def __init__(self, root_dir, cfg): | |
| 13 super(GitSourceControl, self).__init__(root_dir, cfg) | |
| 14 self.git = cfg.get('exe', 'git') | |
| 15 | |
| 16 def getStatus(self): | |
| 17 res = RepoStatus() | |
| 18 st_out = self._run('status', '-s') | |
| 19 for line in st_out.split('\n'): | |
| 20 if not line: | |
| 21 continue | |
| 22 if line.startswith('?? '): | |
| 23 path = line[3:].strip() | |
| 24 if path[-1] == '/': | |
| 25 import glob | |
| 26 res.new_files += [ | |
| 27 f for f in glob.glob(path + '**', recursive=True) | |
| 28 if f[-1] != '/'] | |
| 29 else: | |
| 30 res.new_files.append(path) | |
| 31 elif line.startswith(' M '): | |
| 32 res.edited_files.append(line[3:]) | |
| 33 return res | |
| 34 | |
| 35 def _doCommit(self, paths, message, author): | |
| 36 self._run('add', *paths) | |
| 37 | |
| 38 # Create a temp file with the commit message. | |
| 39 f, temp = tempfile.mkstemp() | |
| 40 with os.fdopen(f, 'w') as fd: | |
| 41 fd.write(message) | |
| 42 | |
| 43 # Commit and clean up the temp file. | |
| 44 try: | |
| 45 commit_args = list(paths) + ['-F', temp] | |
| 46 if author: | |
| 47 commit_args += ['--author="%s"' % author] | |
| 48 self._run('commit', *commit_args) | |
| 49 finally: | |
| 50 os.remove(temp) | |
| 51 | |
| 52 def _run(self, cmd, *args, **kwargs): | |
| 53 exe = [self.git] | |
| 54 exe.append(cmd) | |
| 55 exe += args | |
| 56 | |
| 57 logger.debug("Running Git: " + str(exe)) | |
| 58 proc = subprocess.Popen( | |
| 59 exe, stdout=subprocess.PIPE, cwd=self.root_dir) | |
| 60 out, _ = proc.communicate() | |
| 61 | |
| 62 encoded_out = _s(out) | |
| 63 return encoded_out | |
| 64 |
