<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10065">View Change</a></p><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;">git pull ssh://gerrit.osmocom.org:29418/osmo-ci refs/changes/65/10065/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 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: newchange </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>