svn commit: r241647 - user/crees/rclint
Chris Rees
crees at FreeBSD.org
Wed Oct 17 20:17:57 UTC 2012
Author: crees (ports committer)
Date: Wed Oct 17 20:17:56 2012
New Revision: 241647
URL: http://svn.freebsd.org/changeset/base/241647
Log:
Fix regex code
Submitted by: eadler
Check that last line of file contains check_run_rc
Functions checking still edgy
Modified:
user/crees/rclint/errors.en
user/crees/rclint/problems.en
user/crees/rclint/rclint.py
Modified: user/crees/rclint/errors.en
==============================================================================
--- user/crees/rclint/errors.en Wed Oct 17 19:24:13 2012 (r241646)
+++ user/crees/rclint/errors.en Wed Oct 17 20:17:56 2012 (r241647)
@@ -39,4 +39,9 @@ rcvar_quoted rcvar is quoted Do not quot
rcsid Missing FreeBSD RCSId keyword All rc scripts must contain a line beginning # $FreeBSD$. Do not include blank lines without comment markers at the beginning (#) until the script begins
+run_rc_argument Incorrect argument to run_rc_command The last line of the file should be run_rc_command $1
+run_rc_cruft Order of rc file incorrect Order of the rc file should be shebang/header/$FreeBSD$/setting defaults/setting other definitions/defining functions. Do not include unassociated shell commands, and blocks must be separated by single blank lines. Single blank lines may appear inside the defaults, definitions and functions blocks.
+run_rc_followed run_rc_command line is not the last line in the file Do not write anything after the run_rc_command line
+run_rc_quoted Quoted argument to run_rc_command No need to quote the argument to run_rc_command
+
shebang Incorrect shebang used All rc scripts must start with the correct shebang; #!/bin/sh
Modified: user/crees/rclint/problems.en
==============================================================================
--- user/crees/rclint/problems.en Wed Oct 17 19:24:13 2012 (r241646)
+++ user/crees/rclint/problems.en Wed Oct 17 20:17:56 2012 (r241647)
@@ -1,2 +1,3 @@
# Format of this file: regex<TAB>short_explanation<TAB>explanation
-regex explain explanation
+#regex explain explanation
+^[^#{}.l\s][^-=()]*[^)]$ Unassociated shell command Do not put shell commands outside functions-- it slows down rc on boot and every invocation of the rc file
Modified: user/crees/rclint/rclint.py
==============================================================================
--- user/crees/rclint/rclint.py Wed Oct 17 19:24:13 2012 (r241646)
+++ user/crees/rclint/rclint.py Wed Oct 17 20:17:56 2012 (r241647)
@@ -55,7 +55,7 @@ def explain(error):
initial_indent='==> ', subsequent_indent=' ')
def error(type, line_number, filename):
- logging.error("[%d]%s: %s " % (line_number, filename, errors[type][0]))
+ logging.error("[%d]%s: %s " % (line_number + 1, filename, errors[type][0]))
explain(errors[type])
def check_quoted(string):
@@ -73,7 +73,7 @@ def get_value(var, line):
def get_assignment(line):
try:
- return re.match('(\S+)=(\S+)$', line).groups()
+ return re.match('(\S+)=(.+)$', line).groups()
except:
return False
@@ -246,7 +246,8 @@ def check_functions(lines, num, filename
func = { }
while lines[num]:
- while not lines[num] or lines[num][0] == '#': num += 1
+ while not lines[num] or lines[num][0] == '#':
+ num += 1
if lines[num][-2:] != '()':
if lines[num][-1] == '{':
@@ -257,16 +258,18 @@ def check_functions(lines, num, filename
if ' ' in lines[num]:
error('functions_spaces', num, filename)
func['name'] = lines[num][:-2]
+ func['length'] = 0
num += 1
if lines[num] != '{':
error('functions_brace_missing', num, filename)
num += 1
- tmp = num
+
try:
while lines[num] != '}':
- tmp += 1
+ print lines[num]
+ num += 1
if lines[num] and lines[num][0] != '#':
func['length'] += 1
except:
@@ -276,13 +279,43 @@ def check_functions(lines, num, filename
if func['length'] == 1:
error('functions_short', num, filename)
+ print lines[num]
+ print lines[num+1]
+ print lines[num+2]
+
+ if lines[num+2] and '{' in lines[num+2]:
+ return check_functions(lines, num, filename)
+ else:
+ return num
+
+def check_run_rc(lines, num, filename):
+ logging.debug('Checking the last line of the file contains run_rc_command')
+
+ while not lines[num] or lines[num][0] == '#':
+ num += 1
+
+ try:
+ arg = re.match('run_rc_command (.*)$', lines[num]).group(1)
+ if check_quoted(arg):
+ error('run_rc_quoted', num, filename)
+ elif arg != r'$1':
+ error('run_rc_argument', num, filename)
+
+ if num < len(lines) - 1:
+ error('run_rc_followed', num, filename)
+ except:
+ error('run_rc_cruft', num, filename)
+
def general_checks(lines, filename):
- logging.debug('Checking for unrecommended sequences')
- for num in range(0, len(lines)):
+ logging.debug('Checking for unrecommended sequences and orphan commands')
+ # Don't use regex on last line, it must contain run_rc_command, which fails
+ # unassociated shell command test. We already hacked for load_rc_config
+ for num in range(0, len(lines) - 1):
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.warn("[%d]%s: %s " % (num + 1, filename,
+ problems[regex][0]))
+ explain(problems[regex])
def do_rclint(filename):
logging.debug('Suck in file %s' % filename)
@@ -298,6 +331,7 @@ def do_rclint(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)
+ check_run_rc(lines, lineno['functions'], filename)
general_checks(lines, filename)
@@ -309,7 +343,7 @@ parser.add_argument('-v', action='count'
args = parser.parse_args()
verbosity = args.v
-logging.basicConfig(level=logging.DEBUG if verbosity > 1 else logging.ERROR)
+logging.basicConfig(level=logging.DEBUG if verbosity > 1 else logging.WARN)
errors = read_db('errors', args.language[0])
problems = read_db('problems', args.language[0])
More information about the svn-src-user
mailing list