contribulyze.py

Checkout Tools
  • last updated 4 hours ago
Constraints
Constraints: committers
 
Constraints: files
Constraints: dates
contribulyze.py: Support Python 3 in addition to Python 2.

Explicitly specify how to sort lists of Contributor and lists of LogMessage.

In Python 2 instances of those classes are comparable to each other by way of

the __cmp__ member function, but Python 3 does not support that member

function.

An alternative would have been to implement __lt__ and use

functools.total_ordering.

* tools/dev/contribulyze.py

(functools): Import.

(Contributor.sort_key): New member function.

(LogMessage.sort_key): New member function.

(Contributor.html_out, drop): Specify sorting order.

Work towards Python 3 compatibility. Since we already require Python 2.7+,

we can use the new syntax without further limiting our Python 2 support.

* contrib/client-side/incremental-update.py

* contrib/client-side/svn_apply_autoprops.py

* contrib/client-side/svnmerge/svnmerge-migrate-history.py

* contrib/client-side/svnmerge/svnmerge-migrate-history-remotely.py

* contrib/client-side/svnmerge/svnmerge.py

* contrib/client-side/svnmerge/svnmerge_test.py

* contrib/server-side/add-needs-lock.py

* contrib/server-side/fsfsfixer/fixer/fix-rev.py

* contrib/server-side/fsfsverify.py

* contrib/server-side/svn-tweak-author.py

* subversion/bindings/swig/python/tests/core.py

* subversion/bindings/swig/python/tests/repository.py

* subversion/tests/cmdline/svntest/actions.py

* subversion/tests/cmdline/svntest/main.py

* subversion/tests/cmdline/svntest/objects.py

* subversion/tests/cmdline/svntest/wc.py

* subversion/tests/cmdline/upgrade_tests.py

* tools/client-side/change-svn-wc-format.py

* tools/client-side/mergeinfo-sanitizer.py

* tools/dev/contribulyze.py

* tools/dev/gen-javahl-errors.py

* tools/dev/gen_junit_report.py

* tools/dev/graph-dav-servers.py

* tools/dev/iz/ff2csv.py

* tools/dev/iz/find-fix.py

* tools/dev/wc-ng/bump-to-19.py

* tools/dev/wc-ng/populate-pristine.py

* tools/dev/which-error.py

* tools/examples/get-location-segments.py

* tools/hook-scripts/svn2feed.py

* tools/hook-scripts/svnperms.py

* tools/po/l10n-report.py

* tools/server-side/fsfs-reshard.py

* tools/server-side/svn-backup-dumps.py

* tools/server-side/svnpredumpfilter.py

* tools/server-side/svnpubsub/daemonize.py

* tools/server-side/test_svn_server_log_parse.py

(): Replace all occurances of "except Type, variable:" with Python 3

style "except Type as variable".

  1. … 36 more files in changeset.
* tools/dev/contribulyze.py

(field_re, field_aliases): Recognize "Tested" and "Reported", too.

* tools/dev/contribulyze.py:

Recognize 'Inspired by' in log messages.

Update a few references to HACKING so we point to its new home.

* INSTALL

* README

* tools/dev/contribulyze.py

www/hacking.html lives here now:

http://subversion.apache.org/docs/community-guide/

  1. … 2 more files in changeset.
Fix many of the links pointing to subversion.tigris.org or svn.collab.net.

Approved by: cmpilato

* BUGS,

* CHANGES,

* COMMITTERS,

* INSTALL,

* build/win32/make_gem.rb,

* configure.ac,

* contrib/client-side/emacs/psvn.el,

* notes/commit-access-templates/full-committer.tmpl,

* notes/commit-access-templates/partial-committer.tmpl,

* notes/fsfs,

* notes/l10n-problems,

* notes/merge-tracking/requirements.html,

* packages/python-windows/setup.py,

* packages/solaris/pkginfo.in,

* subversion/bindings/ctypes-python/setup.py,

* subversion/bindings/javahl/src/org/tigris/subversion/javahl/package.html,

* subversion/bindings/swig/python/__init__.py,

* subversion/bindings/swig/python/svn/__init__.py,

* subversion/bindings/swig/python/svn/client.py,

* subversion/bindings/swig/python/svn/core.py,

* subversion/bindings/swig/python/svn/delta.py,

* subversion/bindings/swig/python/svn/diff.py,

* subversion/bindings/swig/python/svn/fs.py,

* subversion/bindings/swig/python/svn/ra.py,

* subversion/bindings/swig/python/svn/repos.py,

* subversion/bindings/swig/python/svn/wc.py,

* subversion/include/svn_props.h,

* subversion/libsvn_repos/repos.c,

* subversion/svn/svn.1,

* subversion/svnadmin/svnadmin.1,

* subversion/svndumpfilter/svndumpfilter.1,

* subversion/svnlook/svnlook.1,

* subversion/svnsync/svnsync.1,

* subversion/svnversion/svnversion.1,

* subversion/tests/cmdline/authz_tests.py,

* subversion/tests/cmdline/autoprop_tests.py,

* subversion/tests/cmdline/basic_tests.py,

* subversion/tests/cmdline/blame_tests.py,

* subversion/tests/cmdline/cat_tests.py,

* subversion/tests/cmdline/changelist_tests.py,

* subversion/tests/cmdline/checkout_tests.py,

* subversion/tests/cmdline/commit_tests.py,

* subversion/tests/cmdline/copy_tests.py,

* subversion/tests/cmdline/depth_tests.py,

* subversion/tests/cmdline/diff_tests.py,

* subversion/tests/cmdline/entries_tests.py,

* subversion/tests/cmdline/export_tests.py,

* subversion/tests/cmdline/externals_tests.py,

* subversion/tests/cmdline/getopt_tests.py,

* subversion/tests/cmdline/history_tests.py,

* subversion/tests/cmdline/import_tests.py,

* subversion/tests/cmdline/info_tests.py,

* subversion/tests/cmdline/lock_tests.py,

* subversion/tests/cmdline/log_tests.py,

* subversion/tests/cmdline/merge_authz_tests.py,

* subversion/tests/cmdline/merge_tests.py,

* subversion/tests/cmdline/mergeinfo_tests.py,

* subversion/tests/cmdline/obliterate_tests.py,

* subversion/tests/cmdline/patch_tests.py,

* subversion/tests/cmdline/prop_tests.py,

* subversion/tests/cmdline/resolve_tests.py,

* subversion/tests/cmdline/resolved_tests.py,

* subversion/tests/cmdline/revert_tests.py,

* subversion/tests/cmdline/schedule_tests.py,

* subversion/tests/cmdline/special_tests.py,

* subversion/tests/cmdline/stat_tests.py,

* subversion/tests/cmdline/svnadmin_tests.py,

* subversion/tests/cmdline/svndumpfilter_tests.py,

* subversion/tests/cmdline/svneditor.py,

* subversion/tests/cmdline/svnlook_tests.py,

* subversion/tests/cmdline/svnsync_tests.py,

* subversion/tests/cmdline/svnversion_tests.py,

* subversion/tests/cmdline/switch_tests.py,

* subversion/tests/cmdline/trans_tests.py,

* subversion/tests/cmdline/tree_conflict_tests.py,

* subversion/tests/cmdline/update_tests.py,

* subversion/tests/cmdline/upgrade_tests.py,

* subversion/tests/cmdline/utf8_tests.py,

* tools/backup/hot-backup.py.in,

* tools/dev/contribulyze.py,

* tools/dist/gen_nightly_ann.py,

* tools/dist/write-announcement.py,

* tools/po/po-update.sh

Fix broken links.

  1. … 82 more files in changeset.
Update every occurence of the Subversion repository URL to apache.org,

except in CHANGES (for sentimental reasons, I guess).

* contrib/cgi/mirror_dir_through_svn.README,

* contrib/client-side/emacs/psvn.el,

* contrib/client-side/svnmerge/svnmerge_test.py,

* contrib/hook-scripts/commit-email.pl.in,

* contrib/server-side/svn-fast-backup,

* contrib/server-side/svnmirror.sh,

* contrib/server-side/svnmirror-test.sh,

* doc/user/cvs-crossover-guide.html,

* notes/fs_dumprestore.txt,

* notes/http-and-webdav/webdav-usage.html,

* notes/interactive-conflict-resolution.txt,

* notes/merge-tracking/func-spec.html,

* notes/merge-tracking/requirements.html,

* notes/merge-tracking/summit.html,

* notes/object-model.txt,

* notes/obliterate/hooks/post-obliterate.tmpl,

* notes/obliterate/hooks/pre-obliterate.tmpl,

* notes/obliterate/plan-milestones.html,

* notes/subversion-design.html,

* notes/variance-adjusted-patching.html,

* packages/windows-innosetup/Pre.rtf,

* packages/windows-WiX/BuildSubversion/WixDialog/loc/en-us/Pre.rtf,

* subversion/bindings/javahl/native/JNIUtil.cpp,

* subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java,

* subversion/bindings/javahl/src/org/apache/subversion/javahl/Version.java,

* subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientInterface.java,

* subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClientSynchronized.java,

* subversion/bindings/javahl/src/org/tigris/subversion/javahl/Version.java,

* subversion/bindings/swig/perl/native/Client.pm,

* subversion/libsvn_repos/repos.c,

* subversion/libsvn_wc/wc_db.h,

* subversion/tests/cmdline/merge_tests.py,

* subversion/tests/libsvn_subr/path-test.c,

* tools/buildbot/slaves/README,

* tools/client-side/change-svn-wc-format.py,

* tools/client-side/svn-graph.pl,

* tools/client-side/svn-viewspec.py,

* tools/dev/contribulyze.py,

* tools/dev/po-merge.py,

* tools/dev/svn-merge-revs.py,

* tools/dist/gen_nightly_ann.py: Update Subversion repository URL to apache.

  1. … 40 more files in changeset.
* tools/dev/contribulyze.py

(field_re): Expect at least one non-whitespace character after the whitespace

field separator.

(grace): Add a bit of stderr logging for when field parsing goes foul.

Apply ASF license headers to a number of files included under that license

but lacking said header.

Patch by: Niall Pemberton <niallp{_AT_}apache.org>

  1. … 175 more files in changeset.
Delete needless functions to simplify some code in contribulyze.py.

* tools/dev/contribulyze.py

(Contributor): Convert to new-style class.

(Contributor.__init__): Don't set __hash__-related variables.

(Contributor.__hash__): Delete.

(LogMessage): Convert to new-style class.

(LogMessage.__hash__): Delete.

Revert r36822 and r36833, due to vetoes.

* subversion/bindings/swig/python/svn/core.py:

(svn_path_compare_paths): restore use of cmp()

* subversion/tests/cmdline/svntest/tree.py:

(SVNTreeNode.__cmp__): restored

(SVNTreeNode.__eq__, SVNTreeNode.__ne__): removed

* subversion/tests/cmdline/svntest/verify.py:

(ExpectedOutput.__cmp__): restored

(ExpectedOutput.__eq__, ExpectedOutput.__ne__): removed

(UnorderedOutput.__cmp__): restored

* tools/dev/contribulyze.py:

(Contributor): restored (admittedly funky) hash behavior and __cmp__

and __hash__ methods. removed __eq__, __ne__, __lt__, and __gt__

methods.

(LogMessage): restored __cmp__ and __hash__ methods. removed __eq__,

__ne__, __lt__ and __gt__ methods.

* tools/dev/trails.py:

(output_summary): restored use of cmp() function

  1. … 4 more files in changeset.
Python 3 compatibility:

Don't use __cmp__().

* subversion/tests/cmdline/svntest/tree.py

(SVNTreeNode.__cmp__): Delete.

(SVNTreeNode.__eq__, SVNTreeNode.__ne__): New.

* subversion/tests/cmdline/svntest/verify.py

(ExpectedOutput.__cmp__): Delete.

(ExpectedOutput.__eq__, ExpectedOutput.__ne__): New.

(UnorderedOutput.__cmp__): Delete.

* tools/dev/contribulyze.py

(Contributor, LogMessage): Convert to new-style classes.

(Contributor.__cmp__, Contributor.__hash__): Delete.

(Contributor.__eq__, Contributor.__ne__, Contributor.__lt__,

Contributor.__gt__): New.

(LogMessage.__cmp__, LogMessage.__hash__): Delete.

(LogMessage.__eq__, LogMessage.__ne__, LogMessage.__lt__,

LogMessage.__gt__): New.

  1. … 2 more files in changeset.
* subversion/tests/cmdline/changelist_tests.py

(info_with_changelists, diff_with_changelists):

* tools/dev/contribulyze.py

(Contributor.html_out): Use sorted() to simplify some code.

  1. … 1 more file in changeset.
Python 3 compatibility:

Don't use cmp().

* subversion/bindings/swig/python/svn/core.py:

* subversion/tests/cmdline/svntest/tree.py:

* tools/dev/contribulyze.py:

* tools/dev/trails.py: Don't use cmp().

  1. … 3 more files in changeset.
Use decorators to simplify some definitions.

* subversion/bindings/ctypes-python/test/remoterepos.py

(RemoteRepositoryTestCase._log_func):

* subversion/bindings/swig/python/svn/core.py

(SubversionException._new_from_err_list):

* tools/dev/contribulyze.py

(Contributor.get, Contributor.parse):

* tools/hook-scripts/svn2feed.py

(Svn2RSS.get_default_file_extension,

Svn2Atom.get_default_file_extension): Use decorators.

  1. … 3 more files in changeset.
Use sorted() to simplify some code.

* build/generator/gen_base.py:

* build/generator/gen_make.py:

* build/generator/gen_vcnet_vcproj.py:

* build/win32/make_dist.py:

* doc/tools/bin/find-xsl.py:

* gen-make.py:

* subversion/bindings/swig/python/tests/mergeinfo.py:

* subversion/bindings/swig/python/tests/ra.py:

* subversion/tests/cmdline/changelist_tests.py:

* subversion/tests/cmdline/svnadmin_tests.py:

* subversion/tests/cmdline/svnlook_tests.py:

* subversion/tests/cmdline/svntest/actions.py:

* subversion/tests/cmdline/svntest/tree.py:

* tools/bdb/svn-bdb-view.py:

* tools/dev/contribulyze.py:

* tools/dev/gen-javahl-errors.py:

* tools/dev/normalize-dump.py:

* tools/dev/which-error.py:

* tools/examples/svnshell.py:

* tools/hook-scripts/mailer/mailer.py:

* tools/po/l10n-report.py: Use sorted() to simplify some code.

  1. … 20 more files in changeset.
Python 3 compatibility:

Don't assing values to True/False keywords.

* build/generator/gen_make.py:

* build/generator/gen_msvc_dsp.py:

* build/generator/gen_vcnet_vcproj.py:

* subversion/bindings/swig/python/svn/repos.py:

* subversion/tests/cmdline/svntest/__init__.py:

* tools/client-side/change-svn-wc-format.py:

* tools/dev/contribulyze.py:

* tools/hook-scripts/log-police.py:

* tools/hook-scripts/mailer/mailer.py: Don't assing values to True/False keywords.

  1. … 8 more files in changeset.
Python 3 compatibility:

Try to use urllib.parse.* and urllib.request.* instead of urllib.* and urllib2.*.

* subversion/tests/cmdline/svntest/main.py:

* tools/dev/contribulyze.py:

* tools/dev/mlpatch.py:

* tools/dist/post-to-tigris.py:

* tools/hook-scripts/mailer/mailer.py:

* tools/server-side/svn_server_log_parse.py:

* tools/server-side/test_svn_server_log_parse.py: Try to use urllib.parse.* and

urllib.request.* instead of urllib.* and urllib2.*.

  1. … 6 more files in changeset.
Python 3 compatibility:

Update calls to print() in 'tools' directory.

* tools/backup/hot-backup.py.in:

* tools/bdb/erase-all-text-data.py:

* tools/bdb/svn-bdb-view.py:

* tools/bdb/whatis-rep.py:

* tools/client-side/change-svn-wc-format.py:

* tools/client-side/server-version.py:

* tools/dev/check-license.py:

* tools/dev/contribulyze.py:

* tools/dev/datecheck.py:

* tools/dev/gen-javahl-errors.py:

* tools/dev/graph-dav-servers.py:

* tools/dev/iz/ff2csv.py:

* tools/dev/iz/find-fix.py:

* tools/dev/mlpatch.py:

* tools/dev/normalize-dump.py:

* tools/dev/po-merge.py:

* tools/dev/random-commits.py:

* tools/dev/scramble-tree.py:

* tools/dev/svn-merge-revs.py:

* tools/dev/verify-history.py:

* tools/dev/which-error.py:

* tools/dist/gen_nightly_ann.py:

* tools/dist/getsigs.py:

* tools/dist/post-to-tigris.py:

* tools/dist/write-announcement.py:

* tools/examples/blame.py:

* tools/examples/check-modified.py:

* tools/examples/dumpprops.py:

* tools/examples/getfile.py:

* tools/examples/get-location-segments.py:

* tools/examples/geturl.py:

* tools/examples/putfile.py:

* tools/examples/revplist.py:

* tools/examples/svnlook.py:

* tools/examples/svnshell.py:

* tools/hook-scripts/mailer/tests/mailer-tweak.py:

* tools/hook-scripts/svn2feed.py:

* tools/po/l10n-report.py:

* tools/server-side/fsfs-reshard.py:

* tools/server-side/svn-backup-dumps.py: Call print() or file.write().

  1. … 39 more files in changeset.
Python 3 compatibility:

Use dict.keys(), dict.values() and dict.items() instead of dict.iterkeys(),

dict.itervalues() and dict.iteritems().

Use list(dict.keys()), list(dict.values()) and list(dict.items()) instead of

dict.keys(), dict.values() and dict.items(). Function calls with 'for', 'in' or

len() weren't updated.

* build/generator/ezt.py:

* build/generator/gen_base.py:

* build/generator/gen_vcnet_vcproj.py:

* build/generator/gen_win.py:

* build/win32/make_dist.py:

* gen-make.py:

* subversion/bindings/ctypes-python/csvn/types.py:

* subversion/bindings/ctypes-python/examples/log.py:

* subversion/bindings/ctypes-python/examples/trunkify.py:

* subversion/bindings/swig/python/tests/mergeinfo.py:

* subversion/bindings/swig/python/tests/ra.py:

* subversion/bindings/swig/python/tests/wc.py:

* subversion/tests/cmdline/externals_tests.py:

* subversion/tests/cmdline/svntest/actions.py:

* tools/bdb/svn-bdb-view.py:

* tools/dev/contribulyze.py:

* tools/dev/gen-javahl-errors.py:

* tools/dev/normalize-dump.py:

* tools/dev/trails.py:

* tools/dev/which-error.py:

* tools/examples/svnshell.py:

* tools/hook-scripts/mailer/mailer.py:

* tools/hook-scripts/svnperms.py: Use dict.keys(), dict.values() and

dict.items() instead of dict.iterkeys(), dict.itervalues() and

dict.iteritems(). Use list(dict.keys()), list(dict.values()) and

list(dict.items()) instead of dict.keys(), dict.values() and dict.items().

  1. … 22 more files in changeset.
Include patches committed by partial committers in the contribulyzer. As

partial committers grow in the project, they usually commit their own patches

following a +1 from a full committer. Those patches required a 'Patch by' line

to show up on the contribulyzer, and this commit fixes that.

* tools/dev/contribulyze.py

(graze): If no 'Patch by' is explicitly given, assume the committer is the

author of the patch.

Don't ignore full committers' email addresses when matching in the

contribulyzer.

* tools/dev/contribulyze.py

(process_committers): When examining COMMITTERS, don't strip off the trailing

newline for a committer's entry. This was causing the regex matcher to not

include the email address in the matched group.

Python 3 compatibility:

Don't use 'has_key'.

* build/generator/ezt.py:

* build/generator/gen_base.py:

* build/generator/gen_win.py:

* gen-make.py:

* subversion/bindings/swig/python/svn/repos.py:

* subversion/bindings/swig/python/tests/client.py:

* subversion/bindings/swig/python/tests/ra.py:

* subversion/tests/cmdline/changelist_tests.py:

* subversion/tests/cmdline/info_tests.py:

* subversion/tests/cmdline/svntest/actions.py:

* subversion/tests/cmdline/svntest/entry.py:

* subversion/tests/cmdline/svntest/main.py:

* tools/backup/hot-backup.py.in:

* tools/bdb/erase-all-text-data.py:

* tools/bdb/svn-bdb-view.py:

* tools/client-side/change-svn-wc-format.py:

* tools/dev/contribulyze.py:

* tools/dev/normalize-dump.py:

* tools/dev/verify-history.py:

* tools/examples/blame.py:

* tools/hook-scripts/mailer/mailer.py:

* tools/hook-scripts/svnperms.py: Use 'in' instead of 'has_key'.

  1. … 21 more files in changeset.
Fix bug in contribulyzer whereby log messages that didn't have their

own final newline would have their terminator separator displayed.

Patch by: stylesen

* tools/dev/contribulyze.py

(graze): Check for separator in the post-field accumulation; if found

a separator, just move immediately to the next log entry.

Improve Contribulyzer output: give each individual contribution a red

rectangular border when jumped to.

* tools/dev/contribulyze.py

(html_header): Take new highlight_targets boolean parameter, use it.

(Contributor.html_out): Pass true for the new parameter.

Add some missing svn:eol-style properties.

* www/toctool.py,

build/win32/make_gem.rb,

subversion/include/svn_compat.h,

subversion/include/svn_iter.h,

subversion/libsvn_diff/diff_memory.c,

subversion/libsvn_subr/iter.c,

subversion/bindings/javahl/native/ConflictResolverCallback.cpp,

subversion/bindings/javahl/native/DiffSummaryReceiver.cpp,

subversion/bindings/javahl/native/org_tigris_subversion_javahl_Version.cpp,

subversion/bindings/javahl/native/org_tigris_subversion_javahl_Path.cpp,

subversion/bindings/javahl/native/org_tigris_subversion_javahl_NativeResources.cpp,

subversion/bindings/javahl/native/CopySources.cpp,

subversion/bindings/javahl/native/RevisionRange.cpp,

subversion/bindings/javahl/native/ProgressListener.cpp,

subversion/bindings/javahl/native/ListCallback.cpp,

subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictDescriptor.java,

subversion/bindings/javahl/src/org/tigris/subversion/javahl/ConflictResolverCallback.java,

subversion/bindings/javahl/src/org/tigris/subversion/javahl/BlameCallback2.java,

subversion/bindings/javahl/src/org/tigris/subversion/javahl/ListCallback.java,

subversion/bindings/swig/python/tests/delta.py,

subversion/bindings/swig/python/tests/wc.py,

subversion/bindings/swig/python/tests/repository.py,

subversion/bindings/swig/python/tests/ra.py,

subversion/bindings/swig/ruby/test/test-unit-ext/priority.rb,

subversion/bindings/swig/ruby/test/test-unit-ext/backtrace-filter.rb,

subversion/bindings/swig/ruby/test/test-unit-ext/always-show-result.rb,

subversion/bindings/swig/ruby/test/test-unit-ext/long-display-for-emacs.rb,

subversion/bindings/swig/ruby/test/test-unit-ext.rb,

subversion/tests/cmdline/svneditor.py,

subversion/tests/cmdline/depth_tests.py,

contrib/client-side/svn_update.pl,

contrib/hook-scripts/check-mime-type.pl,

tools/client-side/svn-graph.pl,

tools/dist/getsigs.pl,

tools/dist/write-announcement.py,

tools/hook-scripts/commit-email.rb,

tools/hook-scripts/log-police.py,

tools/hook-scripts/svn2feed.py,

tools/bdb/whatis-rep.py,

tools/dev/contribulyze.py,

tools/dev/graph-dav-servers.py,

tools/examples/svnlog2html.rb,

tools/examples/svnlook.rb,

tools/examples/svnshell.rb,

tools/po/l10n-report.py,

packages/python-windows/setup.py:

Set svn:eol-style to native.

  1. … 45 more files in changeset.
* tools/dev/contribulyze.py

(Contributor.parse): Handle "{_AT_}" email addresses too.

Suggested by: hwright

* tools/dev/contribulyze.py

(index_introduction): Link to COMMITTERS file when mentioning the

full committers.

Channeling Erik Hülsmann, remove all trailing whitespace within our source

tree:

for extsn in c h cpp java py pl rb; do

sed -i -e 's/[ \t]*$//' `find . -name "*.$extsn" | xargs grep '[ \t]$' -l`

done

Inspired by: ehu

  1. … 449 more files in changeset.
* tools/dev/contribulyze.py

(process_committers): Ignore dormant committers; that is, treat them

like full committers, which they are.

Without this change, Branko Čibej's name (for example) shows up in

contribulyzer output, and that's just a distraction for our purposes.