blob: 9357c7ed8d2ef4c720c707a1e740bb7b6f0c9f4b [file] [log] [blame]
Tim Petersd87f81f2006-03-09 01:42:24 +00001#! /usr/bin/env python
2
3"""
4SVN 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
35
Martin v. Löwisa6e02e82008-06-14 06:24:44 +000036def propfiles(root, fn):
Martin v. Löwis49ac5aa2008-06-14 01:50:46 +000037 default = os.path.join(root, ".svn", "props", fn+".svn-work")
38 try:
39 format = int(open(os.path.join(root, ".svn", "format")).read().strip())
40 except IOError:
Martin v. Löwisa6e02e82008-06-14 06:24:44 +000041 return []
Benjamin Peterson6ed1c932008-11-28 23:18:46 +000042 if format in (8, 9):
43 # In version 8 and 9, committed props are stored in prop-base, local
44 # modifications in props
Martin v. Löwisa6e02e82008-06-14 06:24:44 +000045 return [os.path.join(root, ".svn", "prop-base", fn+".svn-base"),
46 os.path.join(root, ".svn", "props", fn+".svn-work")]
47 raise ValueError, "Unknown repository format"
Martin v. Löwis49ac5aa2008-06-14 01:50:46 +000048
Martin v. Löwis8ff21202006-03-09 02:20:05 +000049def proplist(root, fn):
50 "Return a list of property names for file fn in directory root"
Martin v. Löwis8ff21202006-03-09 02:20:05 +000051 result = []
Martin v. Löwisa6e02e82008-06-14 06:24:44 +000052 for path in propfiles(root, fn):
53 try:
54 f = open(path)
55 except IOError:
56 # no properties file: not under version control,
57 # or no properties set
58 continue
59 while 1:
60 # key-value pairs, of the form
61 # K <length>
62 # <keyname>NL
63 # V length
64 # <value>NL
65 # END
66 line = f.readline()
67 if line.startswith("END"):
68 break
69 assert line.startswith("K ")
70 L = int(line.split()[1])
71 key = f.read(L)
72 result.append(key)
73 f.readline()
74 line = f.readline()
75 assert line.startswith("V ")
76 L = int(line.split()[1])
77 value = f.read(L)
78 f.readline()
79 f.close()
Martin v. Löwis8ff21202006-03-09 02:20:05 +000080 return result
81
Thomas Heller3b9e9ae2006-03-09 18:49:35 +000082possible_text_file = re.compile(r"\.([hc]|py|txt|sln|vcproj)$").search
Tim Peters84457af2006-03-09 01:59:27 +000083
Tim Petersd87f81f2006-03-09 01:42:24 +000084for root, dirs, files in os.walk('.'):
85 if '.svn' in dirs:
86 dirs.remove('.svn')
87 for fn in files:
Tim Peters84457af2006-03-09 01:59:27 +000088 if possible_text_file(fn):
Martin v. Löwis8ff21202006-03-09 02:20:05 +000089 if 'svn:eol-style' not in proplist(root, fn):
90 path = os.path.join(root, fn)
Tim Petersd87f81f2006-03-09 01:42:24 +000091 os.system('svn propset svn:eol-style native "%s"' % path)