<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10065">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Neels Hofmeyr: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">scripts/verify_log_statements.py: on parse error, print file<br><br>If string eval encounters an uncovered parse error, it's useful to know which<br>file it happened in.<br><br>Change-Id: I5fe9a3bbdbfb8a995f24596bf09e70ca5bb3fe8a<br>---<br>M scripts/verify_log_statements.py<br>1 file changed, 45 insertions(+), 42 deletions(-)<br><br></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 567a96a..9a9cd1b 100755</span><br><span>--- a/scripts/verify_log_statements.py</span><br><span>+++ b/scripts/verify_log_statements.py</span><br><span>@@ -63,59 +63,62 @@</span><br><span>   if not (f.endswith('.h') or f.endswith('.c') or f.endswith('.cpp')):</span><br><span>     return []</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  errors_found = []</span><br><span style="color: hsl(120, 100%, 40%);">+  try:</span><br><span style="color: hsl(120, 100%, 40%);">+    errors_found = []</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  file_content = codecs.open(f, "r", "utf-8").read()</span><br><span style="color: hsl(120, 100%, 40%);">+    file_content = codecs.open(f, "r", "utf-8").read()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  for log in log_statement_re.finditer(file_content):</span><br><span style="color: hsl(0, 100%, 40%);">-    quoted = log.group(2)</span><br><span style="color: hsl(120, 100%, 40%);">+    for log in log_statement_re.finditer(file_content):</span><br><span style="color: hsl(120, 100%, 40%);">+      quoted = log.group(2)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    # Skip 'LOG("bla" fmt )' strings that typically appear as #defines.</span><br><span style="color: hsl(0, 100%, 40%);">-    if fmt_re.match(quoted):</span><br><span style="color: hsl(0, 100%, 40%);">-      if debug:</span><br><span style="color: hsl(0, 100%, 40%);">-        errors_found.append(error_found(f, log.start(), 'Skipping define', log.group(0)))</span><br><span style="color: hsl(0, 100%, 40%);">-      continue</span><br><span style="color: hsl(120, 100%, 40%);">+      # Skip 'LOG("bla" fmt )' strings that typically appear as #defines.</span><br><span style="color: hsl(120, 100%, 40%);">+      if fmt_re.match(quoted):</span><br><span style="color: hsl(120, 100%, 40%);">+        if debug:</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 style="color: hsl(120, 100%, 40%);">+        continue</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    # Drop PRI* parts of 'LOG("bla %"PRIu64" foo")'</span><br><span style="color: hsl(0, 100%, 40%);">-    for n in (16,32,64):</span><br><span style="color: hsl(0, 100%, 40%);">-      quoted = quoted.replace('PRIu' + str(n), '')</span><br><span style="color: hsl(0, 100%, 40%);">-      quoted = quoted.replace('PRId' + str(n), '')</span><br><span style="color: hsl(0, 100%, 40%);">-    quoted = ''.join(osmo_stringify_re.split(quoted))</span><br><span style="color: hsl(120, 100%, 40%);">+      # Drop PRI* parts of 'LOG("bla %"PRIu64" foo")'</span><br><span style="color: hsl(120, 100%, 40%);">+      for n in (16,32,64):</span><br><span style="color: hsl(120, 100%, 40%);">+        quoted = quoted.replace('PRIu' + str(n), '')</span><br><span style="color: hsl(120, 100%, 40%);">+        quoted = quoted.replace('PRId' + str(n), '')</span><br><span style="color: hsl(120, 100%, 40%);">+      quoted = ''.join(osmo_stringify_re.split(quoted))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    # Use py eval to join separate string constants: drop any tabs/newlines</span><br><span style="color: hsl(0, 100%, 40%);">-    # that are not in quotes, between separate string constants.</span><br><span style="color: hsl(0, 100%, 40%);">-    try:</span><br><span style="color: hsl(0, 100%, 40%);">-      quoted = eval('(' + quoted + '\n)' )</span><br><span style="color: hsl(0, 100%, 40%);">-    except:</span><br><span style="color: hsl(0, 100%, 40%);">-      # hopefully eval broke because of some '## args' macro def</span><br><span style="color: hsl(0, 100%, 40%);">-      if debug:</span><br><span style="color: hsl(0, 100%, 40%);">-        ignored.append(error_found(f, log.start(), 'Ignoring', log.group(0)))</span><br><span style="color: hsl(0, 100%, 40%);">-      continue</span><br><span style="color: hsl(120, 100%, 40%);">+      # Use py eval to join separate string constants: drop any tabs/newlines</span><br><span style="color: hsl(120, 100%, 40%);">+      # that are not in quotes, between separate string constants.</span><br><span style="color: hsl(120, 100%, 40%);">+      try:</span><br><span style="color: hsl(120, 100%, 40%);">+        quoted = eval('(' + quoted + '\n)' )</span><br><span style="color: hsl(120, 100%, 40%);">+      except:</span><br><span style="color: hsl(120, 100%, 40%);">+        # hopefully eval broke because of some '## args' macro def</span><br><span style="color: hsl(120, 100%, 40%);">+        if debug:</span><br><span style="color: hsl(120, 100%, 40%);">+          ignored.append(error_found(f, log.start(), 'Ignoring', log.group(0)))</span><br><span style="color: hsl(120, 100%, 40%);">+        continue</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    # check for errors...</span><br><span style="color: hsl(120, 100%, 40%);">+      # check for errors...</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    # final newline</span><br><span style="color: hsl(0, 100%, 40%);">-    if not quoted.endswith('\n'):</span><br><span style="color: hsl(0, 100%, 40%);">-      errors_found.append(error_found(f, log.start(), 'Missing final newline', log.group(0)))</span><br><span style="color: hsl(120, 100%, 40%);">+      # final newline</span><br><span style="color: hsl(120, 100%, 40%);">+      if not quoted.endswith('\n'):</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 style="color: hsl(0, 100%, 40%);">-    # disallowed chars and extra newlines</span><br><span style="color: hsl(0, 100%, 40%);">-    for c in quoted[:-1]:</span><br><span style="color: hsl(0, 100%, 40%);">-      if not c.isprintable() and not c == '\t':</span><br><span style="color: hsl(0, 100%, 40%);">-        if c == '\n':</span><br><span style="color: hsl(0, 100%, 40%);">-          msg = 'Extraneous newline'</span><br><span style="color: hsl(0, 100%, 40%);">-        else:</span><br><span style="color: hsl(0, 100%, 40%);">-          msg = 'Illegal char'</span><br><span style="color: hsl(0, 100%, 40%);">-        errors_found.append(error_found(f, log.start(), msg + ' %r' % c, log.group(0)))</span><br><span style="color: hsl(120, 100%, 40%);">+      # disallowed chars and extra newlines</span><br><span style="color: hsl(120, 100%, 40%);">+      for c in quoted[:-1]:</span><br><span style="color: hsl(120, 100%, 40%);">+        if not c.isprintable() and not c == '\t':</span><br><span style="color: hsl(120, 100%, 40%);">+          if c == '\n':</span><br><span style="color: hsl(120, 100%, 40%);">+            msg = 'Extraneous newline'</span><br><span style="color: hsl(120, 100%, 40%);">+          else:</span><br><span style="color: hsl(120, 100%, 40%);">+            msg = 'Illegal char'</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(0, 100%, 40%);">-  if not error_found:</span><br><span style="color: hsl(0, 100%, 40%);">-    return []</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> </span><br><span style="color: hsl(0, 100%, 40%);">-  line_idx = make_line_idx(file_content)</span><br><span style="color: hsl(0, 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(0, 100%, 40%);">-    r.line = line</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> </span><br><span style="color: hsl(0, 100%, 40%);">-  return errors_found</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+    return errors_found</span><br><span style="color: hsl(120, 100%, 40%);">+  except:</span><br><span style="color: hsl(120, 100%, 40%);">+    print("ERROR WHILE PROCESSING %r" % f, file=sys.stderr)</span><br><span style="color: hsl(120, 100%, 40%);">+    raise</span><br><span> </span><br><span> all_errors_found = []</span><br><span> for f in args:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10065">change 10065</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/10065"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: I5fe9a3bbdbfb8a995f24596bf09e70ca5bb3fe8a </div>
<div style="display:none"> Gerrit-Change-Number: 10065 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>