Date: Wed, 17 Oct 2012 19:16:25 +0000 (UTC) From: Chris Rees <crees@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r241644 - user/crees/rclint Message-ID: <201210171916.q9HJGPKu043017@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: crees (ports committer) Date: Wed Oct 17 19:16:24 2012 New Revision: 241644 URL: http://svn.freebsd.org/changeset/base/241644 Log: Style; 4 spaces instead of tabs, no one-line if/whiles Submitted by: eadler Modified: user/crees/rclint/rclint.py Modified: user/crees/rclint/rclint.py ============================================================================== --- user/crees/rclint/rclint.py Wed Oct 17 18:21:14 2012 (r241643) +++ user/crees/rclint/rclint.py Wed Oct 17 19:16:24 2012 (r241644) @@ -36,262 +36,270 @@ import textwrap def read_db(dbname, language): try: - with open('%s.%s' % (dbname, language)) as f: - logging.debug('Sucking in %s database' % dbname) - contents = { } - for e in f.readlines(): - if not e or e[0] == '#': - continue - e = e.split(' ') - contents[e[0]] = e[1:] + with open('%s.%s' % (dbname, language)) as f: + logging.debug('Sucking in %s database' % dbname) + contents = { } + for e in f.readlines(): + if not e or e[0] == '#': + continue + e = e.split(' ') + contents[e[0]] = e[1:] except: - logging.error('Cannot open %s database for language %s' % (dbname, language)) - exit() + logging.error('Cannot open %s database for language %s' % (dbname, language)) + exit() return contents def explain(error): - if verbosity > 0: print textwrap.fill(error[1], initial_indent='==> ', subsequent_indent=' ') + if verbosity > 0: + print textwrap.fill(error[1], + initial_indent='==> ', subsequent_indent=' ') def error(type, line_number, filename): - logging.error("[%d]%s: %s " % (line_number, filename, errors[type][0])) - explain(errors[type]) + logging.error("[%d]%s: %s " % (line_number, filename, errors[type][0])) + explain(errors[type]) def check_quoted(string): - return True if string[0] == '"' or string[0] == "'" else False + return True if string[0] == '"' or string[0] == "'" else False def mandatory(var): - mand = ['enable'] - return True if var.split('_')[-1] in mand else False + mand = ['enable'] + return True if var.split('_')[-1] in mand else False def get_value(var, line): - try: return re.match('%s=(\S+)$' % var, line).group(1) - except: return False + try: + return re.match('%s=(\S+)$' % var, line).group(1) + except: + return False def get_assignment(line): - try: return re.match('(\S+)=(\S+)$', line).groups() - except: return False + try: + return re.match('(\S+)=(\S+)$', line).groups() + except: + return False def check_header(lines, num, filename): - # Basic order; shebang, copyright, RCSId, gap, rcorder + # Basic order; shebang, copyright, RCSId, gap, rcorder - logging.debug('Check shebang') - if lines[num] != '#!/bin/sh': - error('shebang', num, filename) - - logging.debug('Skipping license') - num += 1 - while (not re.match('# \$FreeBSD[:$]', lines[num]) and - (lines[num] == '' or lines[num][0] == '#')): - num += 1 - - logging.debug('Checking for RCSId') - if not re.match('# \$FreeBSD[:$]', lines[num]): - error('rcsid', num, filename) - - num += 1 - while lines[num] == '#' or lines[num] == '': num += 1 - - logging.debug('Checking rcorder order and sucking in names') - if not re.match('# [PRBK]', lines[num]): - error('rcorder_missing', num, filename) - orders = ['provide', 'require', 'before', 'keyword'] - index = 0 - rcorder = { o: [] for o in orders } - while index < 4: - order = orders[index] - try: - for result in re.match('# %s: (.*)' % order.upper(), - lines[num]).group(1).split(' '): - rcorder[order].append(result) - num += 1 - except: - index += 1 + logging.debug('Check shebang') + if lines[num] != '#!/bin/sh': + error('shebang', num, filename) + + logging.debug('Skipping license') + num += 1 + while (not re.match('# \$FreeBSD[:$]', lines[num]) and + (lines[num] == '' or lines[num][0] == '#')): + num += 1 + + logging.debug('Checking for RCSId') + if not re.match('# \$FreeBSD[:$]', lines[num]): + error('rcsid', num, filename) + + num += 1 + while lines[num] == '#' or lines[num] == '': num += 1 + + logging.debug('Checking rcorder order and sucking in names') + if not re.match('# [PRBK]', lines[num]): + error('rcorder_missing', num, filename) + orders = ['provide', 'require', 'before', 'keyword'] + index = 0 + rcorder = {o: [] for o in orders} + while index < 4: + order = orders[index] + try: + for result in re.match('# %s: (.*)' % order.upper(), + lines[num]).group(1).split(' '): + rcorder[order].append(result) + num += 1 + except: + index += 1 - if 'FreeBSD' in rcorder['keyword']: - error('rcorder_keyword_freebsd', num, filename) + if 'FreeBSD' in rcorder['keyword']: + error('rcorder_keyword_freebsd', num, filename) - if re.match('# [PRBK]', lines[num]): - error('rcorder_order', num, filename) + if re.match('# [PRBK]', lines[num]): + error('rcorder_order', num, filename) - return num + return num def check_intro(lines, num, filename): - logging.debug('Checking sourcing lines') - while lines[num] == '' or lines[num][0] == '#': - num += 1 - - if lines[num] != '. /etc/rc.subr': - error('rc_subr_late', num, filename) - - logging.debug('Checking name assignment') - while lines[num] == '' or lines[num][0] == '#' or lines[num][0] == '.': - num += 1 - - name = get_value('name', lines[num]) - if not name: - error('name_missing', num, filename) - elif check_quoted(name): - error('name_quoted', num, filename) - else: - logging.debug('name discovered as %s' % name) - num += 1 - - logging.debug('Checking rcvar') - rcvar = get_value('rcvar', lines[num]) - logging.debug('rcvar discovered as %s' % rcvar if rcvar else 'rcvar not discovered') - if not rcvar: - error('rcvar_missing', num, filename) - elif check_quoted(rcvar): - error('rcvar_quoted', num, filename) - elif rcvar != '%s_enable' % name: - error('rcvar_incorrect', num, filename) - else: - num += 1 - - logging.debug('Checking load_rc_config') - if lines[num] == '': - num += 1 - else: - error('rcvar_extra', num, filename) - - if re.match('load_rc_config (?:\$name|%s)' % name, lines[num]): - num += 1 - else: - error('load_rc_config_missing', num, filename) - - if lines[num] == '': - num += 1 - else: - error('load_rc_config_extra', num, filename) + logging.debug('Checking sourcing lines') + while lines[num] == '' or lines[num][0] == '#': + num += 1 + + if lines[num] != '. /etc/rc.subr': + error('rc_subr_late', num, filename) + + logging.debug('Checking name assignment') + while lines[num] == '' or lines[num][0] == '#' or lines[num][0] == '.': + num += 1 + + name = get_value('name', lines[num]) + if not name: + error('name_missing', num, filename) + elif check_quoted(name): + error('name_quoted', num, filename) + else: + logging.debug('name discovered as %s' % name) + num += 1 + + logging.debug('Checking rcvar') + rcvar = get_value('rcvar', lines[num]) + logging.debug('rcvar discovered as %s' % rcvar if rcvar else 'rcvar not discovered') + + if not rcvar: + error('rcvar_missing', num, filename) + elif check_quoted(rcvar): + error('rcvar_quoted', num, filename) + elif rcvar != '%s_enable' % name: + error('rcvar_incorrect', num, filename) + else: + num += 1 + + logging.debug('Checking load_rc_config') + if lines[num] == '': + num += 1 + else: + error('rcvar_extra', num, filename) + + if re.match('load_rc_config (?:\$name|%s)' % name, lines[num]): + num += 1 + else: + error('load_rc_config_missing', num, filename) + + if lines[num] == '': + num += 1 + else: + error('load_rc_config_extra', num, filename) - return num + return num def check_defaults(lines, num, filename): - logging.debug('Checking defaults set') + logging.debug('Checking defaults set') + + default = { } + try: + while lines[num]: + while lines[num][0] == '#' or lines[num][:4] == 'eval': + num += 1 + if lines[num][0] == ':': + # Shorthand set self-default assignment + (target, operator, value) = re.match(': \${([^:=]+)(:?=)([^}]+)}', lines[num]).groups() + if operator == ':=' and not mandatory(target): + error('defaults_non_mandatory_colon', num, filename) + elif operator == '=' and mandatory(target): + error('defaults_mandatory_colon', num, filename) + + else: + # Longhand set default assignment + (target, source, operator, value) = re.match('([^=]+)=\${([^:-]+)(:?-)([^}]+)}', lines[num]).groups() + if target == source: + error('defaults_old_style', num, filename) + + if operator == ':-' and not mandatory(target): + error('defaults_non_mandatory_colon', num, filename) + elif operator == '-' and mandatory(target): + error('defaults_mandatory_colon', num, filename) + + if check_quoted(value): + error('defaults_value_quoted', num, filename) - default = { } - try: - while lines[num]: - while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1 - if lines[num][0] == ':': - # Shorthand set self-default assignment - (target, operator, value) = re.match(': \${([^:=]+)(:?=)([^}]+)}', lines[num]).groups() - if operator == ':=' and not mandatory(target): - error('defaults_non_mandatory_colon', num, filename) - elif operator == '=' and mandatory(target): - error('defaults_mandatory_colon', num, filename) - - else: - # Longhand set default assignment - (target, source, operator, value) = re.match('([^=]+)=\${([^:-]+)(:?-)([^}]+)}', lines[num]).groups() - if target == source: - error('defaults_old_style', num, filename) - - if operator == ':-' and not mandatory(target): - error('defaults_non_mandatory_colon', num, filename) - elif operator == '-' and mandatory(target): - error('defaults_mandatory_colon', num, filename) - - if check_quoted(value): - error('defaults_value_quoted', num, filename) - - num += 1 - except: - error('defaults_invalid', num, filename) - - # Allow line breaks in the middle; if we put - # gaps in that's usually good style. Lookahead! - if lines[num+1] and (':' in lines[num+1] or '-' in lines[num+1]): - return check_defaults(lines, num, filename) - else: - return num + num += 1 + except: + error('defaults_invalid', num, filename) + + # Allow line breaks in the middle; if we put + # gaps in that's usually good style. Lookahead! + if lines[num+1] and (':' in lines[num+1] or '-' in lines[num+1]): + return check_defaults(lines, num, filename) + else: + return num def check_definitions(lines, num, filename): - logging.debug('Checking the basic definitions') + logging.debug('Checking the basic definitions') - num += 1 + num += 1 - while lines[num]: - while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1 - try: - (var, value) = get_assignment(lines[num]) - except: - error('definitions_missing', num, filename) - return num - - if check_quoted(value): - if ' ' not in lines[num] and ' ' not in lines[num]: - error('definitions_quoted', num, filename) - num += 1 - - # As in check_defaults, allow line breaks in the middle; if we put - # gaps in that's usually good style. Lookahead! - if lines[num+1] and '=' in lines[num+1]: - return check_definitions(lines, num, filename) - else: - return num + while lines[num]: + while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1 + try: + (var, value) = get_assignment(lines[num]) + except: + error('definitions_missing', num, filename) + return num + + if check_quoted(value): + if ' ' not in lines[num] and ' ' not in lines[num]: + error('definitions_quoted', num, filename) + num += 1 + + # As in check_defaults, allow line breaks in the middle; if we put + # gaps in that's usually good style. Lookahead! + if lines[num+1] and '=' in lines[num+1]: + return check_definitions(lines, num, filename) + else: + return num def check_functions(lines, num, filename): - logging.debug('Now checking functions') + logging.debug('Now checking functions') - num += 1 - func = { } + num += 1 + func = { } - while lines[num]: - while not lines[num] or lines[num][0] == '#': num += 1 + while lines[num]: + while not lines[num] or lines[num][0] == '#': num += 1 - if lines[num][-2:] != '()': - if lines[num][-1] == '{': - error('functions_brace_inline', num, filename) - else: - logging.debug('No functions left!') - return num - if ' ' in lines[num]: - error('functions_spaces', num, filename) - func['name'] = lines[num][:-2] - - num += 1 - if lines[num] != '{': - error('functions_brace_missing', num, filename) - - num += 1 - tmp = num - try: - while lines[num] != '}': - tmp += 1 - if lines[num] and lines[num][0] != '#': - func['length'] += 1 - except: - error('functions_neverending', num, filename) - return num + if lines[num][-2:] != '()': + if lines[num][-1] == '{': + error('functions_brace_inline', num, filename) + else: + logging.debug('No functions left!') + return num + if ' ' in lines[num]: + error('functions_spaces', num, filename) + func['name'] = lines[num][:-2] + + num += 1 + if lines[num] != '{': + error('functions_brace_missing', num, filename) + + num += 1 + tmp = num + try: + while lines[num] != '}': + tmp += 1 + if lines[num] and lines[num][0] != '#': + func['length'] += 1 + except: + error('functions_neverending', num, filename) + return num - if func['length'] == 1: - error('functions_short', num, filename) + if func['length'] == 1: + error('functions_short', num, filename) def general_checks(lines, filename): - logging.debug('Checking for unrecommended sequences') - for num in range(0, len(lines)): - for regex in problems.keys(): - if lines[num] and re.search(regex, lines[num]): - logging.warn("[%d]%s: %s " % (num, filename, problems[key][1])) - explain(problem) + logging.debug('Checking for unrecommended sequences') + for num in range(0, len(lines)): + for regex in problems.keys(): + if lines[num] and re.search(regex, lines[num]): + logging.warn("[%d]%s: %s " % (num, filename, problems[key][1])) + explain(problem) def do_rclint(filename): - logging.debug('Suck in file %s' % filename) - try: - lines=[line.rstrip('\n') for line in open(filename)] - except: - logging.error('Cannot open %s for testing' % filename) - return - lineno = { 'begin': 0 } - - lineno['header'] = check_header(lines, lineno['begin'], filename) - lineno['intro'] = check_intro(lines, lineno['header'], filename) - lineno['defaults'] = check_defaults(lines, lineno['intro'], filename) - lineno['definitions'] = check_definitions(lines, lineno['defaults'], filename) - lineno['functions'] = check_functions(lines, lineno['definitions'], filename) + logging.debug('Suck in file %s' % filename) + try: + lines=[line.rstrip('\n') for line in open(filename)] + except: + logging.error('Cannot open %s for testing' % filename) + return + lineno = {'begin': 0} + + lineno['header'] = check_header(lines, lineno['begin'], filename) + lineno['intro'] = check_intro(lines, lineno['header'], filename) + lineno['defaults'] = check_defaults(lines, lineno['intro'], filename) + lineno['definitions'] = check_definitions(lines, lineno['defaults'], filename) + lineno['functions'] = check_functions(lines, lineno['definitions'], filename) - general_checks(lines, filename) + general_checks(lines, filename) parser = argparse.ArgumentParser() parser.add_argument('filenames', nargs = '+') @@ -307,4 +315,4 @@ errors = read_db('errors', args.language problems = read_db('problems', args.language[0]) for file in args.filenames: - do_rclint(file) + do_rclint(file)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210171916.q9HJGPKu043017>