| #!/usr/bin/env python | |
| # | |
| # gen-py-errors.py: Generate a python module which maps error names to numbers. | |
| # (The purpose being easier writing of the python tests.) | |
| # | |
| # ==================================================================== | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| # ==================================================================== | |
| # | |
| # | |
| # Locates svn_error_codes.h based on its relative location to this script. | |
| # | |
| # Generates to STDOUT. Typically, redirect this into svntest/err.py | |
| # | |
| import sys | |
| import os | |
| import re | |
| HEADER = '''#!/usr/bin/env python | |
| ### This file automatically generated by tools/dev/gen-py-errors.py, | |
| ### which see for more information | |
| ### | |
| ### It is versioned for convenience. | |
| ''' | |
| # Established by svn 1.0. May as well hard-code these. | |
| APR_OS_START_ERROR = 20000 | |
| APR_OS_START_USERERR = APR_OS_START_ERROR + 50000 * 2 | |
| SVN_ERR_CATEGORY_SIZE = 5000 | |
| RE_CAT_NAME = re.compile(r'SVN_ERR_([A-Z_]+)_CATEG') | |
| RE_CAT_VALUE = re.compile(r'\d+') | |
| RE_DEF_NAME = re.compile(r'SVN_ERRDEF\(([A-Z0-9_]+)') | |
| RE_DEF_VALUE = re.compile(r'SVN_ERR_([A-Z_]+)_CATEG[^0-9]*([0-9]+)') | |
| def write_output(codes): | |
| print(HEADER) | |
| for name, value in codes: | |
| # skip SVN_ERR_ on the name | |
| print('%s = %d' % (name[8:], value)) | |
| def main(codes_fname): | |
| categ = { } | |
| codes = [ ] | |
| f = open(codes_fname) | |
| # Parse all the category start values | |
| while True: | |
| line = f.next() | |
| m = RE_CAT_NAME.search(line) | |
| if m: | |
| name = m.group(1) | |
| m = RE_CAT_VALUE.search(f.next()) | |
| assert m | |
| value = int(m.group(0)) | |
| categ[name] = APR_OS_START_USERERR + value * SVN_ERR_CATEGORY_SIZE | |
| elif line.strip() == 'SVN_ERROR_START': | |
| break | |
| # Parse each of the error values | |
| while True: | |
| line = f.next() | |
| m = RE_DEF_NAME.search(line) | |
| if m: | |
| name = m.group(1) | |
| line = f.next() | |
| m = RE_DEF_VALUE.search(line) | |
| if not m: | |
| # SVN_ERR_WC_NOT_DIRECTORY is defined as equal to NOT_WORKING_COPY | |
| # rather than relative to SVN_ERR_WC_CATEGORY_START | |
| #print 'SKIP:', line | |
| continue | |
| cat = m.group(1) | |
| value = int(m.group(2)) | |
| codes.append((name, categ[cat] + value)) | |
| elif line.strip() == 'SVN_ERROR_END': | |
| break | |
| write_output(sorted(codes)) | |
| if __name__ == '__main__': | |
| this_dir = os.path.dirname(os.path.abspath(__file__)) | |
| codes_fname = os.path.join(this_dir, os.path.pardir, os.path.pardir, | |
| 'subversion', 'include', 'svn_error_codes.h') | |
| main(codes_fname) |