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