diff --git a/Tools/scripts/svneol.py b/Tools/scripts/svneol.py index 9bab1750e02..d82b69f9646 100644 --- a/Tools/scripts/svneol.py +++ b/Tools/scripts/svneol.py @@ -28,14 +28,43 @@ For a file 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 - -TODO: This is slow, and especially on Windows, because it invokes a new svn -command-line operation for every file with the right extension. """ import re import os +def proplist(root, fn): + "Return a list of property names for file fn in directory root" + path = os.path.join(root, ".svn", "props", fn+".svn-work") + try: + f = open(path) + except IOError: + # no properties file: not under version control + return [] + result = [] + while 1: + # key-value pairs, of the form + # K + # NL + # V length + # 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)$").search for root, dirs, files in os.walk('.'): @@ -43,9 +72,6 @@ for root, dirs, files in os.walk('.'): dirs.remove('.svn') for fn in files: if possible_text_file(fn): - path = os.path.join(root, fn) - p = os.popen('svn proplist "%s"' % path) - guts = p.read() - p.close() - if 'eol-style' not in guts: + 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)