1 | import os.path
|
---|
2 | import subprocess
|
---|
3 | import sys
|
---|
4 |
|
---|
5 | import reindent
|
---|
6 |
|
---|
7 |
|
---|
8 | def status(message, modal=False, info=None):
|
---|
9 | """Decorator to output status info to stdout."""
|
---|
10 | def decorated_fxn(fxn):
|
---|
11 | def call_fxn(*args, **kwargs):
|
---|
12 | sys.stdout.write(message + ' ... ')
|
---|
13 | sys.stdout.flush()
|
---|
14 | result = fxn(*args, **kwargs)
|
---|
15 | if not modal and not info:
|
---|
16 | print "done"
|
---|
17 | elif info:
|
---|
18 | print info(result)
|
---|
19 | else:
|
---|
20 | if result:
|
---|
21 | print "yes"
|
---|
22 | else:
|
---|
23 | print "NO"
|
---|
24 | return result
|
---|
25 | return call_fxn
|
---|
26 | return decorated_fxn
|
---|
27 |
|
---|
28 | @status("Getting the list of files that have been added/changed",
|
---|
29 | info=lambda x: "%s files" % len(x))
|
---|
30 | def changed_files():
|
---|
31 | """Run ``svn status`` and return a set of files that have been
|
---|
32 | changed/added."""
|
---|
33 | cmd = 'svn status --quiet --non-interactive --ignore-externals'
|
---|
34 | svn_st = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
---|
35 | svn_st.wait()
|
---|
36 | output = [line.strip() for line in svn_st.stdout.readlines()]
|
---|
37 | files = set()
|
---|
38 | for line in output:
|
---|
39 | if not line[0] in ('A', 'M'):
|
---|
40 | continue
|
---|
41 | line_parts = line.split()
|
---|
42 | path = line_parts[-1]
|
---|
43 | if os.path.isfile(path):
|
---|
44 | files.add(path)
|
---|
45 | return files
|
---|
46 |
|
---|
47 | @status("Fixing whitespace", info=lambda x: "%s files" % x)
|
---|
48 | def normalize_whitespace(file_paths):
|
---|
49 | """Make sure that the whitespace for .py files have been normalized."""
|
---|
50 | reindent.makebackup = False # No need to create backups.
|
---|
51 | result = map(reindent.check, (x for x in file_paths if x.endswith('.py')))
|
---|
52 | return sum(result)
|
---|
53 |
|
---|
54 | @status("Docs modified", modal=True)
|
---|
55 | def docs_modified(file_paths):
|
---|
56 | """Report if any files in the Docs directory."""
|
---|
57 | for path in file_paths:
|
---|
58 | if path.startswith("Doc"):
|
---|
59 | return True
|
---|
60 | return False
|
---|
61 |
|
---|
62 | @status("Misc/ACKS updated", modal=True)
|
---|
63 | def credit_given(file_paths):
|
---|
64 | """Check if Misc/ACKS has been changed."""
|
---|
65 | return 'Misc/ACKS' in file_paths
|
---|
66 |
|
---|
67 | @status("Misc/NEWS updated", modal=True)
|
---|
68 | def reported_news(file_paths):
|
---|
69 | """Check if Misc/NEWS has been changed."""
|
---|
70 | return 'Misc/NEWS' in file_paths
|
---|
71 |
|
---|
72 |
|
---|
73 | def main():
|
---|
74 | file_paths = changed_files()
|
---|
75 | # PEP 7/8 verification.
|
---|
76 | normalize_whitespace(file_paths)
|
---|
77 | # Docs updated.
|
---|
78 | docs_modified(file_paths)
|
---|
79 | # Misc/ACKS changed.
|
---|
80 | credit_given(file_paths)
|
---|
81 | # Misc/NEWS changed.
|
---|
82 | reported_news(file_paths)
|
---|
83 |
|
---|
84 | # Test suite run and passed.
|
---|
85 | print
|
---|
86 | print "Did you run the test suite?"
|
---|
87 |
|
---|
88 |
|
---|
89 | if __name__ == '__main__':
|
---|
90 | main()
|
---|