debugcommands: create new debugantivirusrunning command
This writes the EICAR test file to .hg/cache, in an attempt to trigger
an AV scanner's scanning engine. This should let us (in theory) detect
some cases when a user's slowness is a result of AV scanning.
Differential Revision: https://phab.mercurial-scm.org/D8353
--- a/mercurial/debugcommands.py Fri Jul 17 03:28:52 2020 +0200
+++ b/mercurial/debugcommands.py Wed Apr 01 08:42:00 2020 -0500
@@ -127,6 +127,23 @@
ui.write(b'%d:%s\n' % (r.rev(a), hex(a)))
+@command(b'debugantivirusrunning', [])
+def debugantivirusrunning(ui, repo):
+ """attempt to trigger an antivirus scanner to see if one is active"""
+ with repo.cachevfs.open('eicar-test-file.com', b'wb') as f:
+ f.write(
+ util.b85decode(
+ # This is a base85-armored version of the EICAR test file. See
+ # https://en.wikipedia.org/wiki/EICAR_test_file for details.
+ b'ST#=}P$fV?P+K%yP+C|uG$>GBDK|qyDK~v2MM*<JQY}+dK~6+LQba95P'
+ b'E<)&Nm5l)EmTEQR4qnHOhq9iNGnJx'
+ )
+ )
+ # Give an AV engine time to scan the file.
+ time.sleep(2)
+ util.unlink(repo.cachevfs.join('eicar-test-file.com'))
+
+
@command(b'debugapplystreamclonebundle', [], b'FILE')
def debugapplystreamclonebundle(ui, repo, fname):
"""apply a stream clone bundle file"""
--- a/tests/test-completion.t Fri Jul 17 03:28:52 2020 +0200
+++ b/tests/test-completion.t Wed Apr 01 08:42:00 2020 -0500
@@ -74,6 +74,7 @@
Show debug commands if there are no other candidates
$ hg debugcomplete debug
debugancestor
+ debugantivirusrunning
debugapplystreamclonebundle
debugbackupbundle
debugbuilddag
@@ -261,6 +262,7 @@
continue: dry-run
copy: forget, after, at-rev, force, include, exclude, dry-run
debugancestor:
+ debugantivirusrunning:
debugapplystreamclonebundle:
debugbackupbundle: recover, patch, git, limit, no-merges, stat, graph, style, template
debugbuilddag: mergeable-file, overwritten-file, new-file
--- a/tests/test-help.t Fri Jul 17 03:28:52 2020 +0200
+++ b/tests/test-help.t Wed Apr 01 08:42:00 2020 -0500
@@ -971,6 +971,8 @@
debugancestor
find the ancestor revision of two revisions in a given index
+ debugantivirusrunning
+ attempt to trigger an antivirus scanner to see if one is active
debugapplystreamclonebundle
apply a stream clone bundle file
debugbackupbundle