annotate september.py @ 5:9c6605b1619b draft default tip

Make directories absolute and expand tilde-paths.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 12 May 2015 23:55:27 -0700
parents bdfc8a4a335d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import re
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import sys
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import json
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import os.path
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 import logging
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
7 import hashlib
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 import argparse
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
9 import tempfile
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 import subprocess
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 import configparser
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 from urllib.parse import urlparse
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 logger = logging.getLogger(__name__)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 class IRepo(object):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 def clone(self, repo_url, repo_path):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 raise NotImplementedError()
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
22 def pull(self, repo_path, remote):
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 raise NotImplementedError()
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 def getTags(self, repo_path):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 raise NotImplementedError()
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 def update(self, repo_path, rev_id):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 raise NotImplementedError()
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 class GitRepo(object):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 def clone(self, repo_url, repo_path):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 subprocess.check_call(['git', 'clone', repo_url, repo_path])
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
36 def pull(self, repo_path, remote):
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
37 subprocess.check_call(['git', '-C', repo_path,
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
38 'pull', remote, 'master'])
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 def getTags(self, repo_path):
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
41 output = subprocess.check_output(['git', '-C', repo_path,
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
42 'show-ref', '--tags'])
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 pat = re.compile(r'^(?P<id>[0-9a-f]+) (?P<tag>.+)$')
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 for line in output.split('\n'):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 m = pat.match(line)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 if m:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 yield (m.group('tag'), m.group('id'))
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 def update(self, repo_path, rev_id):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 rev_id = rev_id or 'master'
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
51 subprocess.check_call(['git', '-C', repo_path, 'checkout', rev_id])
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 class MercurialRepo(object):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 def clone(self, repo_url, repo_path):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 subprocess.check_call(['hg', 'clone', repo_url, repo_path])
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
58 def pull(self, repo_path, remote):
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
59 subprocess.check_call(['hg', '-R', repo_path, 'pull', remote],
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 stderr=subprocess.STDOUT)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 def getTags(self, repo_path):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 output = subprocess.check_output(
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
64 ('hg -R "' + repo_path +
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
65 '" log -r "tag()" --template "{tags} {node}\\n"'),
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 stderr=subprocess.STDOUT,
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 universal_newlines=True,
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 shell=True)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 pat = re.compile(r'^(?P<tag>.+) (?P<id>[0-9a-f]+)$')
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 for line in output.split('\n'):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 m = pat.match(line)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 if m:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 yield (m.group('tag'), m.group('id'))
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 def update(self, repo_path, rev_id):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 rev_id = rev_id or 'default'
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
77 subprocess.check_call(['hg', '-R', repo_path, 'update', rev_id],
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 stderr=subprocess.STDOUT)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 repo_class = {
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 'git': GitRepo,
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 'hg': MercurialRepo}
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 def guess_repo_type(repo):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 # Parse repo as an URL: scheme://netloc/path;parameters?query#fragment
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 scheme, netloc, path, params, query, fragment = urlparse(repo)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 if scheme == 'ssh':
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 if netloc.startswith('git@'):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 return 'git'
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 if netloc.startswith('hg@'):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 return 'hg'
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 elif scheme == 'https':
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 if path.endswith('.git'):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 return 'git'
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 elif scheme == '' and netloc == '' and os.path.isdir(path):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 if os.path.isdir(os.path.join(path, '.git')):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 return 'git'
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 if os.path.isdir(os.path.join(path, '.hg')):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 return 'hg'
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 return None
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 def main():
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 # Setup the argument parser.
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 parser = argparse.ArgumentParser(
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 prog='september',
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 description=("An utility that goes back in time and does "
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 "something in the background."))
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 parser.add_argument(
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 'repo',
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
113 nargs='?',
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 help="The repository to observe and process")
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 parser.add_argument(
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 '-t', '--tmp-dir',
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 help="The temporary directory in which to clone the repository.")
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 parser.add_argument(
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 '--scm',
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 default='guess',
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 choices=['guess', 'git', 'mercurial'],
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 help="The type of source control system handling the repository.")
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 parser.add_argument(
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 '--config',
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 help="The configuration file to use.")
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 parser.add_argument(
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 '--command',
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 help="The command to run on each tag.")
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
129 parser.add_argument(
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
130 '--scan-only',
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
131 action='store_true',
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
132 help=("Only scan the repository history. Don't update or run the "
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
133 "command"))
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
134 parser.add_argument(
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
135 '--status',
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
136 action='store_true',
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
137 help="See September's status for the given repository.")
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
139 # Parse arguments.
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 res = parser.parse_args()
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
141 repo_dir = res.repo or os.getcwd()
5
9c6605b1619b Make directories absolute and expand tilde-paths.
Ludovic Chabant <ludovic@chabant.com>
parents: 4
diff changeset
142 repo_dir = os.path.abspath(repo_dir)
4
bdfc8a4a335d Expose more information to the command formatting.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
143 work_dir = os.getcwd()
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
144
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
145 # Guess the repo type.
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 repo_type = res.scm
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 if not repo_type or repo_type == 'guess':
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
148 repo_type = guess_repo_type(repo_dir)
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 if not repo_type:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150 logger.error("Can't guess the repository type. Please use the "
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151 "--scm option to specify it.")
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 sys.exit(1)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153 if repo_type not in repo_class:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 logger.error("Unknown repository type: %s" % repo_type)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155 sys.exit(1)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
157 # Find the configuration file.
4
bdfc8a4a335d Expose more information to the command formatting.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
158 config_file_dir = None
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
159 config_file = res.config or os.path.join(repo_dir, '.september.cfg')
5
9c6605b1619b Make directories absolute and expand tilde-paths.
Ludovic Chabant <ludovic@chabant.com>
parents: 4
diff changeset
160 config_file = os.path.abspath(config_file)
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 config = configparser.ConfigParser(interpolation=None)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162 if os.path.exists(config_file):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 logger.info("Loading configuration file: %s" % config_file)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164 config.read(config_file)
4
bdfc8a4a335d Expose more information to the command formatting.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
165 config_file_dir = os.path.dirname(config_file)
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
167 # Validate the configuration.
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 if not config.has_section('september'):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 config.add_section('september')
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
170 config_sec = config['september']
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
171 if res.command:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172 config_sec['command'] = res.command
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
173 if res.tmp_dir:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
174 config_sec['tmp_dir'] = res.tmp_dir
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 if not config.has_option('september', 'command'):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 logger.error("There is no 'command' configuration setting under the "
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 "'september' section, and no command was passed as an "
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 "option.")
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 sys.exit(1)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
182 # Get the temp dir.
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
183 tmp_dir = config_sec.get('tmp_dir', None)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
184 if not tmp_dir:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
185 tmp_name = 'september_%s' % hashlib.md5(
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
186 repo_dir.encode('utf8')).hexdigest()
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
187 tmp_dir = os.path.join(tempfile.gettempdir(), tmp_name)
5
9c6605b1619b Make directories absolute and expand tilde-paths.
Ludovic Chabant <ludovic@chabant.com>
parents: 4
diff changeset
188 elif tmp_dir.startswith('~'):
9c6605b1619b Make directories absolute and expand tilde-paths.
Ludovic Chabant <ludovic@chabant.com>
parents: 4
diff changeset
189 tmp_dir = os.path.expanduser(tmp_dir)
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
190
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191 # Find the cache file in the temp directory.
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
192 cache_file = os.path.join(tmp_dir, 'september.json')
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193 if os.path.exists(cache_file):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194 with open(cache_file, 'r') as fp:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 cache = json.load(fp)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 else:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 cache = {'tags': {}}
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
199 # See if we just need to show the status:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
200 if res.status:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
201 logger.info("Status for '%s':" % repo_dir)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
202 for t, v in cache['tags'].items():
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
203 logger.info("- %s" % t)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
204 logger.info(" commit ID : %s" % v['id'])
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
205 logger.info(" processed? : %s" % v['processed'])
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
206 return
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
207
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
208 # Create the repo handler.
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
209 repo = repo_class[repo_type]()
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
210
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 # Update the cache: get any new/moved tags.
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212 first_tag = config_sec.get('first_tag', None)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
213 tag_pattern = config_sec.get('tag_pattern', None)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
214 tag_re = None
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215 if tag_pattern:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216 tag_re = re.compile(tag_pattern)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
218 reached_first_tag = not bool(first_tag)
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 previous_tags = cache['tags']
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
220 tags = repo.getTags(repo_dir)
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 for t, i in tags:
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
222 if not reached_first_tag and first_tag == t:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
223 reached_first_tag = True
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
224
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
225 if not reached_first_tag:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
226 if t in previous_tags:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
227 logger.info("Removing tag '%s'." % t)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
228 del previous_tags[t]
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
229 continue
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
230
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 if not tag_re or tag_re.search(t):
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 if t not in previous_tags:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 logger.info("Adding tag '%s'." % t)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 previous_tags[t] = {'id': i, 'processed': False}
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 elif previous_tags[t]['id'] != i:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 logger.info("Moving tag '%s'." % t)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237 previous_tags[t] = {'id': i, 'processed': False}
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 logger.info("Updating cache file '%s'." % cache_file)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 with open(cache_file, 'w') as fp:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 json.dump(cache, fp)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242
1
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
243 if res.scan_only:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
244 return
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
245
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
246 # Clone or update/checkout the repository in the temp directory.
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
247 clone_dir = os.path.join(tmp_dir, 'clone')
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
248 if not os.path.exists(clone_dir):
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
249 logger.info("Cloning '%s' into: %s" % (repo_dir, clone_dir))
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
250 repo.clone(repo_dir, clone_dir)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
251 else:
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
252 logger.info("Pulling changes from '%s'." % repo_dir)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
253 repo.pull(clone_dir, repo_dir)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
254 repo.update(clone_dir, None)
6bbebb01f614 Bunch of fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
255
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 # Process tags!
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 use_shell = config_sec.get('use_shell') in ['1', 'yes', 'true']
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 for tn, ti in cache['tags'].items():
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 if ti['processed']:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 logger.info("Skipping '%s'." % tn)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 continue
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 logger.info("Updating repo to '%s'." % tn)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 repo.update(clone_dir, ti['id'])
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 command = config_sec['command'] % {
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 'rev_id': ti['id'],
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268 'root_dir': clone_dir,
4
bdfc8a4a335d Expose more information to the command formatting.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
269 'config_dir': config_file_dir,
bdfc8a4a335d Expose more information to the command formatting.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
270 'work_dir': work_dir,
0
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 'tag': tn}
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272 logger.info("Running: %s" % command)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 subprocess.check_call(command, shell=use_shell)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 ti['processed'] = True
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 with open(cache_file, 'w') as fp:
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 json.dump(cache, fp)
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 if __name__ == '__main__':
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 logging.basicConfig(level=logging.INFO, format='%(message)s')
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 main()
ee98303e24b8 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283