Mercurial > piecrust2
comparison piecrust/admin/scm/mercurial.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/mercurial.py@a77b4656c602 |
children |
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 MercurialSourceControl(SourceControl): | |
12 def __init__(self, root_dir, cfg): | |
13 super(MercurialSourceControl, self).__init__(root_dir, cfg) | |
14 self.hg = cfg.get('exe', 'hg') | |
15 | |
16 def getStatus(self): | |
17 res = RepoStatus() | |
18 st_out = self._run('status') | |
19 for line in st_out.split('\n'): | |
20 if len(line) == 0: | |
21 continue | |
22 if line[0] == '?' or line[0] == 'A': | |
23 res.new_files.append(line[2:]) | |
24 elif line[0] == 'M': | |
25 res.edited_files.append(line[2:]) | |
26 return res | |
27 | |
28 def _doCommit(self, paths, message, author): | |
29 # Check if any of those paths needs to be added. | |
30 st_out = self._run('status', *paths) | |
31 add_paths = [] | |
32 for line in st_out.splitlines(): | |
33 if line[0] == '?': | |
34 add_paths.append(line[2:]) | |
35 if len(add_paths) > 0: | |
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) + ['-l', temp] | |
46 if author: | |
47 commit_args += ['-u', author] | |
48 self._run('commit', *commit_args) | |
49 finally: | |
50 os.remove(temp) | |
51 | |
52 def _run(self, cmd, *args, **kwargs): | |
53 exe = [self.hg, '-R', self.root_dir] | |
54 exe.append(cmd) | |
55 exe += args | |
56 | |
57 env = dict(os.environ) | |
58 env['HGPLAIN'] = 'True' | |
59 | |
60 logger.debug("Running Mercurial: " + str(exe)) | |
61 proc = subprocess.Popen(exe, stdout=subprocess.PIPE, env=env) | |
62 out, _ = proc.communicate() | |
63 | |
64 encoded_out = _s(out) | |
65 return encoded_out | |
66 |