<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10063">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">scripts/verify_log_statements.py: figure out line numbers<br><br>Change-Id: Ib75c8f5a99ed556d85896b7f8c65fb9446a2fbce<br>---<br>M scripts/verify_log_statements.py<br>1 file changed, 61 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ci refs/changes/63/10063/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/scripts/verify_log_statements.py b/scripts/verify_log_statements.py</span><br><span>index 48f406b..6108c23 100755</span><br><span>--- a/scripts/verify_log_statements.py</span><br><span>+++ b/scripts/verify_log_statements.py</span><br><span>@@ -22,26 +22,57 @@</span><br><span> re.MULTILINE | re.DOTALL)</span><br><span> fmt_re = re.compile(r'("[^"]*".*)*fmt')</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-errors_found = 0</span><br><span> debug = ('-d' in sys.argv) or ('--debug' in sys.argv)</span><br><span> </span><br><span> args = [x for x in sys.argv[1:] if not (x == '-d' or x == '--debug')]</span><br><span> if not args:</span><br><span> args = ['.']</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+class error_found:</span><br><span style="color: hsl(120, 100%, 40%);">+ def __init__(self, f, charpos, msg, text):</span><br><span style="color: hsl(120, 100%, 40%);">+ self.f = f</span><br><span style="color: hsl(120, 100%, 40%);">+ self.charpos = charpos</span><br><span style="color: hsl(120, 100%, 40%);">+ self.msg = msg</span><br><span style="color: hsl(120, 100%, 40%);">+ self.text = text</span><br><span style="color: hsl(120, 100%, 40%);">+ self.line = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def make_line_idx(file_content):</span><br><span style="color: hsl(120, 100%, 40%);">+ line_idx = []</span><br><span style="color: hsl(120, 100%, 40%);">+ pos = 0</span><br><span style="color: hsl(120, 100%, 40%);">+ line_nr = 1</span><br><span style="color: hsl(120, 100%, 40%);">+ line_idx.append((pos, line_nr))</span><br><span style="color: hsl(120, 100%, 40%);">+ for line in file_content.split('\n'):</span><br><span style="color: hsl(120, 100%, 40%);">+ pos += len(line)</span><br><span style="color: hsl(120, 100%, 40%);">+ line_nr += 1</span><br><span style="color: hsl(120, 100%, 40%);">+ line_idx.append((pos, line_nr))</span><br><span style="color: hsl(120, 100%, 40%);">+ pos += 1 # newline char</span><br><span style="color: hsl(120, 100%, 40%);">+ return line_idx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def char_pos_2_line(line_idx, sorted_char_positions):</span><br><span style="color: hsl(120, 100%, 40%);">+ r = []</span><br><span style="color: hsl(120, 100%, 40%);">+ line_i = 0</span><br><span style="color: hsl(120, 100%, 40%);">+ next_line_i = 1</span><br><span style="color: hsl(120, 100%, 40%);">+ for char_pos in sorted_char_positions:</span><br><span style="color: hsl(120, 100%, 40%);">+ while (line_i+1) < len(line_idx) and char_pos > line_idx[line_i+1][0]:</span><br><span style="color: hsl(120, 100%, 40%);">+ line_i += 1</span><br><span style="color: hsl(120, 100%, 40%);">+ r.append(line_idx[line_i][1])</span><br><span style="color: hsl(120, 100%, 40%);">+ return r</span><br><span> </span><br><span> def check_file(f):</span><br><span style="color: hsl(0, 100%, 40%);">- global errors_found</span><br><span> if not (f.endswith('.h') or f.endswith('.c') or f.endswith('.cpp')):</span><br><span style="color: hsl(0, 100%, 40%);">- return</span><br><span style="color: hsl(120, 100%, 40%);">+ return []</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for log in log_statement_re.finditer(codecs.open(f, "r", "utf-8").read()):</span><br><span style="color: hsl(120, 100%, 40%);">+ errors_found = []</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ file_content = codecs.open(f, "r", "utf-8").read()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for log in log_statement_re.finditer(file_content):</span><br><span> quoted = log.group(2)</span><br><span> </span><br><span> # Skip 'LOG("bla" fmt )' strings that typically appear as #defines.</span><br><span> if fmt_re.match(quoted):</span><br><span> if debug:</span><br><span style="color: hsl(0, 100%, 40%);">- print('Skipping define:', f, '\n'+log.group(0))</span><br><span style="color: hsl(120, 100%, 40%);">+ errors_found.append(error_found(f, log.start(), 'Skipping define', log.group(0)))</span><br><span> continue</span><br><span> </span><br><span> # Drop PRI* parts of 'LOG("bla %"PRIu64" foo")'</span><br><span>@@ -56,15 +87,14 @@</span><br><span> except:</span><br><span> # hopefully eval broke because of some '## args' macro def</span><br><span> if debug:</span><br><span style="color: hsl(0, 100%, 40%);">- print('Ignoring:', f, '\n'+log.group(0)) </span><br><span style="color: hsl(120, 100%, 40%);">+ ignored.append(error_found(f, log.start(), 'Ignoring', log.group(0)))</span><br><span> continue</span><br><span> </span><br><span> # check for errors...</span><br><span> </span><br><span> # final newline</span><br><span> if not quoted.endswith('\n'):</span><br><span style="color: hsl(0, 100%, 40%);">- print('Missing final newline:', f, '\n'+log.group(0))</span><br><span style="color: hsl(0, 100%, 40%);">- errors_found += 1</span><br><span style="color: hsl(120, 100%, 40%);">+ errors_found.append(error_found(f, log.start(), 'Missing final newline', log.group(0)))</span><br><span> </span><br><span> # disallowed chars and extra newlines</span><br><span> for c in quoted[:-1]:</span><br><span>@@ -73,15 +103,33 @@</span><br><span> msg = 'Extraneous newline'</span><br><span> else:</span><br><span> msg = 'Illegal char'</span><br><span style="color: hsl(0, 100%, 40%);">- print('%s %r in' % (msg, c), f, '\n' + log.group(0))</span><br><span style="color: hsl(0, 100%, 40%);">- errors_found += 1</span><br><span style="color: hsl(120, 100%, 40%);">+ errors_found.append(error_found(f, log.start(), msg + ' %r' % c, log.group(0)))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if not error_found:</span><br><span style="color: hsl(120, 100%, 40%);">+ return []</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ line_idx = make_line_idx(file_content)</span><br><span style="color: hsl(120, 100%, 40%);">+ for r, line in zip(errors_found, char_pos_2_line(line_idx, [rr.charpos for rr in errors_found])):</span><br><span style="color: hsl(120, 100%, 40%);">+ r.line = line</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return errors_found</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+all_errors_found = []</span><br><span> for f in args:</span><br><span> if os.path.isdir(f):</span><br><span> for parent_path, subdirs, files in os.walk(f, None, None):</span><br><span> for ff in files:</span><br><span style="color: hsl(0, 100%, 40%);">- check_file(os.path.join(parent_path, ff))</span><br><span style="color: hsl(120, 100%, 40%);">+ all_errors_found.extend(check_file(os.path.join(parent_path, ff)))</span><br><span> else:</span><br><span style="color: hsl(0, 100%, 40%);">- check_file(f)</span><br><span style="color: hsl(120, 100%, 40%);">+ all_errors_found.extend(check_file(f))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-sys.exit(errors_found)</span><br><span style="color: hsl(120, 100%, 40%);">+def print_errors(errs):</span><br><span style="color: hsl(120, 100%, 40%);">+ for err in errs:</span><br><span style="color: hsl(120, 100%, 40%);">+ print('%s: %s:%d\n%s\n' % (err.msg, err.f, err.line or 0, err.text))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print_errors(all_errors_found)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sys.exit(len(all_errors_found))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: tabstop=2 shiftwidth=2 expandtab</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10063">change 10063</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10063"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ci </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ib75c8f5a99ed556d85896b7f8c65fb9446a2fbce </div>
<div style="display:none"> Gerrit-Change-Number: 10063 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>