mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00

And most of the tools. Patch by Emanual Barry, reviewed by me, Serhiy Storchaka, and Martin Panter.
114 lines
3.4 KiB
Python
Executable file
114 lines
3.4 KiB
Python
Executable file
#! /usr/bin/env python3
|
|
|
|
r"""
|
|
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
|
|
import sys
|
|
import subprocess
|
|
|
|
|
|
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 True:
|
|
# 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
|
|
|
|
|
|
def set_eol_native(path):
|
|
cmd = 'svn propset svn:eol-style native "{}"'.format(path)
|
|
propset = subprocess.Popen(cmd, shell=True)
|
|
propset.wait()
|
|
|
|
|
|
possible_text_file = re.compile(r"\.([hc]|py|txt|sln|vcproj)$").search
|
|
|
|
|
|
def main():
|
|
for arg in sys.argv[1:] or [os.curdir]:
|
|
if os.path.isfile(arg):
|
|
root, fn = os.path.split(arg)
|
|
if 'svn:eol-style' not in proplist(root, fn):
|
|
set_eol_native(arg)
|
|
elif os.path.isdir(arg):
|
|
for root, dirs, files in os.walk(arg):
|
|
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)
|
|
set_eol_native(path)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|