| #!/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) |