150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#! /usr/bin/python 250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 327f654740f2a26ad62a5c155af9199af9e69b889claireho# Copyright (C) 2009-2010, International Business Machines Corporation, Google and Others. 450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# All rights reserved. 550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# Script to check and fix svn property settings for ICU source files. 850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# Also check for the correct line endings on files with svn:eol-style = native 950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# THIS SCRIPT DOES NOT WORK ON WINDOWS 1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# It only works correctly on platforms where the native line ending is a plain \n 1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# usage: 1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# icu-svnprops-check.py [options] 1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# options: 1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# -f | --fix Fix any problems that are found 1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# -h | --help Print a usage line and exit. 1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# The tool operates recursively on the directory from which it is run. 2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# Only files from the svn repository are checked. 2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# No changes are made to the repository; only the working copy will be altered. 2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoimport sys 2550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoimport os 2650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoimport os.path 2750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoimport re 2850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoimport getopt 2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# svn autoprops definitions. 3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# Copy and paste here the ICU recommended auto-props from 3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# http://icu-project.org/docs/subversion_howto/index.html 3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# This program will parse this autoprops string, and verify that files in 3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# the repository have the recommeded properties set. 3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# 3850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehosvn_auto_props = """ 3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho### Section for configuring automatic properties. 4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho[auto-props] 4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho### The format of the entries is: 4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho### file-name-pattern = propname[=value][;propname[=value]...] 4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho### The file-name-pattern can contain wildcards (such as '*' and 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho### '?'). All entries which match will be applied to the file. 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho### Note that auto-props functionality must be enabled, which 4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho### is typically done by setting the 'enable-auto-props' option. 4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.c = svn:eol-style=native 4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.cc = svn:eol-style=native 4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.cpp = svn:eol-style=native 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.h = svn:eol-style=native 5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.rc = svn:eol-style=native 5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.dsp = svn:eol-style=native 5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.dsw = svn:eol-style=native 5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.sln = svn:eol-style=native 5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.vcproj = svn:eol-style=native 5650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconfigure = svn:eol-style=native;svn:executable 5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.sh = svn:eol-style=native;svn:executable 5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.pl = svn:eol-style=native;svn:executable 5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.py = svn:eol-style=native;svn:executable 6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.txt = svn:mime-type=text/plain;svn:eol-style=native 6127f654740f2a26ad62a5c155af9199af9e69b889claireho*.java = svn:eol-style=native;svn:mime-type=text/plain;;charset=utf-8 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.ucm = svn:eol-style=native 6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.html = svn:eol-style=native;svn:mime-type=text/html 6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.htm = svn:eol-style=native;svn:mime-type=text/html 6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.xml = svn:eol-style=native 6650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoMakefile = svn:eol-style=native 6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.in = svn:eol-style=native 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.mak = svn:eol-style=native 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.mk = svn:eol-style=native 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.png = svn:mime-type=image/png 7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.jpeg = svn:mime-type=image/jpeg 7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.jpg = svn:mime-type=image/jpeg 7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.bin = svn:mime-type=application/octet-stream 7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.brk = svn:mime-type=application/octet-stream 7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.cnv = svn:mime-type=application/octet-stream 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.dat = svn:mime-type=application/octet-stream 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.icu = svn:mime-type=application/octet-stream 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.res = svn:mime-type=application/octet-stream 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.spp = svn:mime-type=application/octet-stream 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# new additions 2007-dec-5 srl 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.rtf = mime-type=text/rtf 8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*.pdf = mime-type=application/pdf 8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# changed 2008-04-08: modified .txt, above, adding mime-type 8427f654740f2a26ad62a5c155af9199af9e69b889claireho# changed 2010-11-09: modified .java, adding mime-type 8527f654740f2a26ad62a5c155af9199af9e69b889claireho# Note: The escape syntax for semicolon (";;") is supported since subversion 1.6.1 8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho""" 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# file_types: The parsed form of the svn auto-props specification. 9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# A list of file types - .cc, .cpp, .txt, etc. 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# each element is a [type, proplist] 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# "type" is a regular expression string that will match a file name 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# prop list is another list, one element per property. 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho# Each property item is a two element list, [prop name, prop value] 9550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehofile_types = list() 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodef parse_auto_props(): 9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho aprops = svn_auto_props.splitlines() 9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for propline in aprops: 10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if re.match("\s*(#.*)?$", propline): # Match comment and blank lines 10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho continue 10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if re.match("\s*\[auto-props\]", propline): # Match the [auto-props] line. 10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho continue 10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if not re.match("\s*[^\s]+\s*=", propline): # minimal syntax check for <file-type> = 10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print "Bad line from autoprops definitions: " + propline 10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho continue 10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho file_type, string_proplist = propline.split("=", 1) 10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho #transform the file type expression from autoprops into a normal regular expression. 11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho # e.g. "*.cpp" ==> ".*\.cpp$" 11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho file_type = file_type.strip() 11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho file_type = file_type.replace(".", "\.") 11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho file_type = file_type.replace("*", ".*") 11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho file_type = file_type + "$" 11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho # example string_proplist at this point: " svn:eol-style=native;svn:executable" 11727f654740f2a26ad62a5c155af9199af9e69b889claireho # split on ';' into a list of properties. The negative lookahead and lookbehind 11827f654740f2a26ad62a5c155af9199af9e69b889claireho # in the split regexp are to prevent matching on ';;', which is an escaped ';' 11927f654740f2a26ad62a5c155af9199af9e69b889claireho # within a property value. 12027f654740f2a26ad62a5c155af9199af9e69b889claireho string_proplist = re.split("(?<!;);(?!;)", string_proplist) 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho proplist = list() 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for prop in string_proplist: 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if prop.find("=") >= 0: 12427f654740f2a26ad62a5c155af9199af9e69b889claireho prop_name, prop_val = prop.split("=", 1) 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else: 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho # properties with no explicit value, e.g. svn:executable 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho prop_name, prop_val = prop, "" 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho prop_name = prop_name.strip() 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho prop_val = prop_val.strip() 13027f654740f2a26ad62a5c155af9199af9e69b889claireho # unescape any ";;" in a property value, e.g. the mime-type from 13127f654740f2a26ad62a5c155af9199af9e69b889claireho # *.java = svn:eol-style=native;svn:mime-type=text/plain;;charset=utf-8 13227f654740f2a26ad62a5c155af9199af9e69b889claireho prop_val = prop_val.replace(";;", ";"); 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho proplist.append((prop_name, prop_val)) 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho file_types.append((file_type, proplist)) 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho # print file_types 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodef runCommand(cmd): 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho output_file = os.popen(cmd); 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho output_text = output_file.read(); 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho exit_status = output_file.close(); 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if exit_status: 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print >>sys.stderr, '"', cmd, '" failed. Exiting.' 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sys.exit(exit_status) 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return output_text 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodef usage(): 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print "usage: " + sys.argv[0] + " [-f | --fix] [-h | --help]" 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15327f654740f2a26ad62a5c155af9199af9e69b889claireho# 15427f654740f2a26ad62a5c155af9199af9e69b889claireho# UTF-8 file check. For text files, add a charset to the mime-type if their contents are UTF-8 15527f654740f2a26ad62a5c155af9199af9e69b889claireho# file_name: name of a text file. 15627f654740f2a26ad62a5c155af9199af9e69b889claireho# base_mime_type: svn:mime-type property value from the auto-props file (no charset= part) 15727f654740f2a26ad62a5c155af9199af9e69b889claireho# actual_mime_type: existing svn:mime-type property value for the file. 15827f654740f2a26ad62a5c155af9199af9e69b889claireho# return: svn:mime-type property value, with charset added when appropriate. 15927f654740f2a26ad62a5c155af9199af9e69b889claireho# 16027f654740f2a26ad62a5c155af9199af9e69b889clairehodef check_utf8(file_name, base_mime_type, actual_mime_type): 16127f654740f2a26ad62a5c155af9199af9e69b889claireho 16227f654740f2a26ad62a5c155af9199af9e69b889claireho # If the file already has a charset in its mime-type, don't make any change. 16327f654740f2a26ad62a5c155af9199af9e69b889claireho 16427f654740f2a26ad62a5c155af9199af9e69b889claireho if actual_mime_type.find("charset=") > 0: 16527f654740f2a26ad62a5c155af9199af9e69b889claireho return actual_mime_type; 16627f654740f2a26ad62a5c155af9199af9e69b889claireho 16727f654740f2a26ad62a5c155af9199af9e69b889claireho f = open(file_name, 'r') 16827f654740f2a26ad62a5c155af9199af9e69b889claireho bytes = f.read() 16927f654740f2a26ad62a5c155af9199af9e69b889claireho f.close() 17027f654740f2a26ad62a5c155af9199af9e69b889claireho 17127f654740f2a26ad62a5c155af9199af9e69b889claireho if all(ord(byte) < 128 for byte in bytes): 17227f654740f2a26ad62a5c155af9199af9e69b889claireho # pure ASCII. 17327f654740f2a26ad62a5c155af9199af9e69b889claireho # print "Pure ASCII " + file_name 17427f654740f2a26ad62a5c155af9199af9e69b889claireho return base_mime_type 17527f654740f2a26ad62a5c155af9199af9e69b889claireho 17627f654740f2a26ad62a5c155af9199af9e69b889claireho try: 17727f654740f2a26ad62a5c155af9199af9e69b889claireho bytes.decode("UTF-8") 17827f654740f2a26ad62a5c155af9199af9e69b889claireho except UnicodeDecodeError: 17927f654740f2a26ad62a5c155af9199af9e69b889claireho print "warning: %s: not ASCII, not UTF-8" % file_name 18027f654740f2a26ad62a5c155af9199af9e69b889claireho return base_mime_type 18127f654740f2a26ad62a5c155af9199af9e69b889claireho 18227f654740f2a26ad62a5c155af9199af9e69b889claireho if ord(bytes[0]) != 0xef: 18327f654740f2a26ad62a5c155af9199af9e69b889claireho print "UTF-8 file with no BOM: " + file_name 18427f654740f2a26ad62a5c155af9199af9e69b889claireho 18527f654740f2a26ad62a5c155af9199af9e69b889claireho # Append charset=utf-8. Need to escape the ';' because it is ultimately going to a shell. 18627f654740f2a26ad62a5c155af9199af9e69b889claireho return base_mime_type + '\\;charset=utf-8' 18727f654740f2a26ad62a5c155af9199af9e69b889claireho 18827f654740f2a26ad62a5c155af9199af9e69b889claireho 18950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodef main(argv): 19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fix_problems = False; 19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho try: 19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho opts, args = getopt.getopt(argv, "fh", ("fix", "help")) 19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho except getopt.GetoptError: 19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print "unrecognized option: " + argv[0] 19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho usage() 19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sys.exit(2) 19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for opt, arg in opts: 19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if opt in ("-h", "--help"): 19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho usage() 20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sys.exit() 20150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if opt in ("-f", "--fix"): 20250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fix_problems = True 20350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if args: 20450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print "unexpected command line argument" 20550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho usage() 20650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sys.exit() 20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parse_auto_props() 20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho output = runCommand("svn ls -R "); 21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho file_list = output.splitlines() 21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for f in file_list: 21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if os.path.isdir(f): 21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho # print "Skipping dir " + f 21550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho continue 21650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if not os.path.isfile(f): 21750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print "Repository file not in working copy: " + f 21850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho continue; 21950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 22050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for file_pattern, props in file_types: 22150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if re.match(file_pattern, f): 22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho # print "doing " + f 22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for propname, propval in props: 22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho actual_propval = runCommand("svn propget --strict " + propname + " " + f) 22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho #print propname + ": " + actual_propval 22627f654740f2a26ad62a5c155af9199af9e69b889claireho if propname == "svn:mime-type" and propval.find("text/") == 0: 22727f654740f2a26ad62a5c155af9199af9e69b889claireho # check for UTF-8 text files, should have svn:mime-type=text/something; charset=utf8 22827f654740f2a26ad62a5c155af9199af9e69b889claireho propval = check_utf8(f, propval, actual_propval) 22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if not (propval == actual_propval or (propval == "" and actual_propval == "*")): 23027f654740f2a26ad62a5c155af9199af9e69b889claireho print "svn propset %s '%s' %s" % (propname, propval, f) 23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if fix_problems: 23227f654740f2a26ad62a5c155af9199af9e69b889claireho os.system("svn propset %s '%s' %s" % (propname, propval, f)) 23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if propname == "svn:eol-style" and propval == "native": 23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if os.system("grep -q -v \r " + f): 23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if fix_problems: 23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print f + ": Removing DOS CR characters." 23750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho os.system("sed -i s/\r// " + f); 23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else: 23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho print f + " contains DOS CR characters." 24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 24127f654740f2a26ad62a5c155af9199af9e69b889claireho 24250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoif __name__ == "__main__": 24350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho main(sys.argv[1:]) 244