|
1 #! /usr/bin/env python |
|
2 |
|
3 """ |
|
4 SVN helper script. |
|
5 |
|
6 Try to set the svn:eol-style property to "native" on every .py, .txt, .c and |
|
7 .h file in the directory tree rooted at the current directory. |
|
8 |
|
9 Files with the svn:eol-style property already set (to anything) are skipped. |
|
10 |
|
11 svn will itself refuse to set this property on a file that's not under SVN |
|
12 control, or that has a binary mime-type property set. This script inherits |
|
13 that behavior, and passes on whatever warning message the failing "svn |
|
14 propset" command produces. |
|
15 |
|
16 In the Python project, it's safe to invoke this script from the root of |
|
17 a checkout. |
|
18 |
|
19 No output is produced for files that are ignored. For a file that gets |
|
20 svn:eol-style set, output looks like: |
|
21 |
|
22 property 'svn:eol-style' set on 'Lib\ctypes\__init__.py' |
|
23 |
|
24 For a file not under version control: |
|
25 |
|
26 svn: warning: 'patch-finalizer.txt' is not under version control |
|
27 |
|
28 and for a file with a binary mime-type property: |
|
29 |
|
30 svn: File 'Lib\test\test_pep263.py' has binary mime type property |
|
31 """ |
|
32 |
|
33 import re |
|
34 import os |
|
35 |
|
36 def proplist(root, fn): |
|
37 "Return a list of property names for file fn in directory root" |
|
38 path = os.path.join(root, ".svn", "props", fn+".svn-work") |
|
39 try: |
|
40 f = open(path) |
|
41 except IOError: |
|
42 # no properties file: not under version control |
|
43 return [] |
|
44 result = [] |
|
45 while 1: |
|
46 # key-value pairs, of the form |
|
47 # K <length> |
|
48 # <keyname>NL |
|
49 # V length |
|
50 # <value>NL |
|
51 # END |
|
52 line = f.readline() |
|
53 if line.startswith("END"): |
|
54 break |
|
55 assert line.startswith("K ") |
|
56 L = int(line.split()[1]) |
|
57 key = f.read(L) |
|
58 result.append(key) |
|
59 f.readline() |
|
60 line = f.readline() |
|
61 assert line.startswith("V ") |
|
62 L = int(line.split()[1]) |
|
63 value = f.read(L) |
|
64 f.readline() |
|
65 f.close() |
|
66 return result |
|
67 |
|
68 possible_text_file = re.compile(r"\.([hc]|py|txt|sln|vcproj)$").search |
|
69 |
|
70 for root, dirs, files in os.walk('.'): |
|
71 if '.svn' in dirs: |
|
72 dirs.remove('.svn') |
|
73 for fn in files: |
|
74 if possible_text_file(fn): |
|
75 if 'svn:eol-style' not in proplist(root, fn): |
|
76 path = os.path.join(root, fn) |
|
77 os.system('svn propset svn:eol-style native "%s"' % path) |