| #! /usr/bin/env python | |
| """ | |
| SVN helper script. | |
| Try to set the svn:eol-style property to "native" on every .py, .txt, .c and | |
| .h file in the directory tree rooted at the current directory. | |
| Files with the svn:eol-style property already set (to anything) are skipped. | |
| svn will itself refuse to set this property on a file that's not under SVN | |
| control, or that has a binary mime-type property set. This script inherits | |
| that behavior, and passes on whatever warning message the failing "svn | |
| propset" command produces. | |
| In the Python project, it's safe to invoke this script from the root of | |
| a checkout. | |
| No output is produced for files that are ignored. For a file that gets | |
| svn:eol-style set, output looks like: | |
| property 'svn:eol-style' set on 'Lib\ctypes\__init__.py' | |
| For a file not under version control: | |
| svn: warning: 'patch-finalizer.txt' is not under version control | |
| and for a file with a binary mime-type property: | |
| svn: File 'Lib\test\test_pep263.py' has binary mime type property | |
| """ | |
| import re | |
| import os | |
| def propfiles(root, fn): | |
| default = os.path.join(root, ".svn", "props", fn+".svn-work") | |
| try: | |
| format = int(open(os.path.join(root, ".svn", "format")).read().strip()) | |
| except IOError: | |
| return [] | |
| if format in (8, 9): | |
| # In version 8 and 9, committed props are stored in prop-base, local | |
| # modifications in props | |
| return [os.path.join(root, ".svn", "prop-base", fn+".svn-base"), | |
| os.path.join(root, ".svn", "props", fn+".svn-work")] | |
| raise ValueError, "Unknown repository format" | |
| def proplist(root, fn): | |
| "Return a list of property names for file fn in directory root" | |
| result = [] | |
| for path in propfiles(root, fn): | |
| try: | |
| f = open(path) | |
| except IOError: | |
| # no properties file: not under version control, | |
| # or no properties set | |
| continue | |
| while 1: | |
| # key-value pairs, of the form | |
| # K <length> | |
| # <keyname>NL | |
| # V length | |
| # <value>NL | |
| # END | |
| line = f.readline() | |
| if line.startswith("END"): | |
| break | |
| assert line.startswith("K ") | |
| L = int(line.split()[1]) | |
| key = f.read(L) | |
| result.append(key) | |
| f.readline() | |
| line = f.readline() | |
| assert line.startswith("V ") | |
| L = int(line.split()[1]) | |
| value = f.read(L) | |
| f.readline() | |
| f.close() | |
| return result | |
| possible_text_file = re.compile(r"\.([hc]|py|txt|sln|vcproj)$").search | |
| for root, dirs, files in os.walk('.'): | |
| if '.svn' in dirs: | |
| dirs.remove('.svn') | |
| for fn in files: | |
| if possible_text_file(fn): | |
| if 'svn:eol-style' not in proplist(root, fn): | |
| path = os.path.join(root, fn) | |
| os.system('svn propset svn:eol-style native "%s"' % path) |