<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>