blob: 6c70da9692221decd5215f76f1c0ff4f82a2cc3c [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Tim Petersd87f81f2006-03-09 01:42:24 +00002
R David Murray44b548d2016-09-08 13:59:53 -04003r"""
Tim Petersd87f81f2006-03-09 01:42:24 +00004SVN helper script.
5
Tim Peters84457af2006-03-09 01:59:27 +00006Try 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.
Tim Petersd87f81f2006-03-09 01:42:24 +00008
9Files with the svn:eol-style property already set (to anything) are skipped.
10
11svn will itself refuse to set this property on a file that's not under SVN
12control, or that has a binary mime-type property set. This script inherits
13that behavior, and passes on whatever warning message the failing "svn
14propset" command produces.
15
16In the Python project, it's safe to invoke this script from the root of
17a checkout.
18
19No output is produced for files that are ignored. For a file that gets
20svn:eol-style set, output looks like:
21
22 property 'svn:eol-style' set on 'Lib\ctypes\__init__.py'
23
24For a file not under version control:
25
26 svn: warning: 'patch-finalizer.txt' is not under version control
27
28and for a file with a binary mime-type property:
29
30 svn: File 'Lib\test\test_pep263.py' has binary mime type property
Tim Petersd87f81f2006-03-09 01:42:24 +000031"""
32
Tim Peters84457af2006-03-09 01:59:27 +000033import re
Tim Petersd87f81f2006-03-09 01:42:24 +000034import os
Florent Xiclunae4a33802010-08-09 12:24:20 +000035import sys
36import subprocess
37
Tim Petersd87f81f2006-03-09 01:42:24 +000038
Martin v. Löwis6d291c12008-06-14 06:25:37 +000039def propfiles(root, fn):
Florent Xiclunae4a33802010-08-09 12:24:20 +000040 default = os.path.join(root, ".svn", "props", fn + ".svn-work")
Martin v. Löwisa08702a2008-06-14 01:51:58 +000041 try:
42 format = int(open(os.path.join(root, ".svn", "format")).read().strip())
43 except IOError:
Martin v. Löwis6d291c12008-06-14 06:25:37 +000044 return []
Benjamin Peterson4469d0c2008-11-30 22:46:23 +000045 if format in (8, 9):
46 # In version 8 and 9, committed props are stored in prop-base, local
47 # modifications in props
Florent Xiclunae4a33802010-08-09 12:24:20 +000048 return [os.path.join(root, ".svn", "prop-base", fn + ".svn-base"),
49 os.path.join(root, ".svn", "props", fn + ".svn-work")]
50 raise ValueError("Unknown repository format")
51
Martin v. Löwisa08702a2008-06-14 01:51:58 +000052
Martin v. Löwis8ff21202006-03-09 02:20:05 +000053def proplist(root, fn):
Florent Xiclunae4a33802010-08-09 12:24:20 +000054 """Return a list of property names for file fn in directory root."""
Martin v. Löwis8ff21202006-03-09 02:20:05 +000055 result = []
Martin v. Löwis6d291c12008-06-14 06:25:37 +000056 for path in propfiles(root, fn):
57 try:
58 f = open(path)
59 except IOError:
60 # no properties file: not under version control,
61 # or no properties set
62 continue
Florent Xiclunae4a33802010-08-09 12:24:20 +000063 while True:
Martin v. Löwis6d291c12008-06-14 06:25:37 +000064 # key-value pairs, of the form
65 # K <length>
66 # <keyname>NL
67 # V length
68 # <value>NL
69 # END
70 line = f.readline()
71 if line.startswith("END"):
72 break
73 assert line.startswith("K ")
74 L = int(line.split()[1])
75 key = f.read(L)
76 result.append(key)
77 f.readline()
78 line = f.readline()
79 assert line.startswith("V ")
80 L = int(line.split()[1])
81 value = f.read(L)
82 f.readline()
83 f.close()
Martin v. Löwis8ff21202006-03-09 02:20:05 +000084 return result
85
Florent Xiclunae4a33802010-08-09 12:24:20 +000086
87def set_eol_native(path):
88 cmd = 'svn propset svn:eol-style native "{}"'.format(path)
89 propset = subprocess.Popen(cmd, shell=True)
90 propset.wait()
91
92
Thomas Heller3b9e9ae2006-03-09 18:49:35 +000093possible_text_file = re.compile(r"\.([hc]|py|txt|sln|vcproj)$").search
Tim Peters84457af2006-03-09 01:59:27 +000094
Florent Xiclunae4a33802010-08-09 12:24:20 +000095
96def main():
97 for arg in sys.argv[1:] or [os.curdir]:
98 if os.path.isfile(arg):
99 root, fn = os.path.split(arg)
Martin v. Löwis8ff21202006-03-09 02:20:05 +0000100 if 'svn:eol-style' not in proplist(root, fn):
Florent Xiclunae4a33802010-08-09 12:24:20 +0000101 set_eol_native(arg)
102 elif os.path.isdir(arg):
103 for root, dirs, files in os.walk(arg):
104 if '.svn' in dirs:
105 dirs.remove('.svn')
106 for fn in files:
107 if possible_text_file(fn):
108 if 'svn:eol-style' not in proplist(root, fn):
109 path = os.path.join(root, fn)
110 set_eol_native(path)
111
112
113if __name__ == '__main__':
114 main()