annotate piecrust/admin/scm/git.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents 82509bce94ca
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
660
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import logging
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import tempfile
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import subprocess
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 from .base import SourceControl, RepoStatus, _s
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 logger = logging.getLogger(__name__)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 class GitSourceControl(SourceControl):
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 def __init__(self, root_dir, cfg):
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 super(GitSourceControl, self).__init__(root_dir, cfg)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 self.git = cfg.get('exe', 'git')
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 def getStatus(self):
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 res = RepoStatus()
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 st_out = self._run('status', '-s')
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 for line in st_out.split('\n'):
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 if not line:
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 continue
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 if line.startswith('?? '):
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 path = line[3:].strip()
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 if path[-1] == '/':
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 import glob
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 res.new_files += [
812
82509bce94ca internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
27 f for f in glob.glob(path + '**', recursive=True)
82509bce94ca internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
28 if f[-1] != '/']
660
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 else:
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 res.new_files.append(path)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 elif line.startswith(' M '):
777
8d633ca59bc5 admin: Fixes for the Git support.
Ludovic Chabant <ludovic@chabant.com>
parents: 660
diff changeset
32 res.edited_files.append(line[3:])
660
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 return res
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 def _doCommit(self, paths, message, author):
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 self._run('add', *paths)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 # Create a temp file with the commit message.
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 f, temp = tempfile.mkstemp()
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 with os.fdopen(f, 'w') as fd:
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 fd.write(message)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 # Commit and clean up the temp file.
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 try:
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 commit_args = list(paths) + ['-F', temp]
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 if author:
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 commit_args += ['--author="%s"' % author]
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 self._run('commit', *commit_args)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 finally:
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 os.remove(temp)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 def _run(self, cmd, *args, **kwargs):
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 exe = [self.git]
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 exe.append(cmd)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 exe += args
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 logger.debug("Running Git: " + str(exe))
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 proc = subprocess.Popen(
812
82509bce94ca internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents: 778
diff changeset
59 exe, stdout=subprocess.PIPE, cwd=self.root_dir)
660
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 out, _ = proc.communicate()
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 encoded_out = _s(out)
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 return encoded_out
9f391ab1b4e0 admin: Add support for Git source-control.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64